This is the full developer documentation for Kalender Sync # Kalender Sync Hilfe > Anleitungen, Antworten und Tipps rund um die DSGVO-konforme Kalendersynchronisation. ## Wie können wir helfen? [Abschnitt betitelt „Wie können wir helfen?“](#wie-können-wir-helfen) [Erste Schritte](/getting-started/what-is-kalender-sync/)Konto einrichten, ersten Kalender verbinden und den ersten Sync starten. [Kalender verbinden](/connect-calendar/google/)Google, Microsoft, Apple iCloud, GMX, WEB.DE, mailbox.org, Posteo, STRATO, Disroot, KSuite oder iCal-Feed anbinden. [Organisation blockiert die Verbindung?](/connect-calendar/org-blocked/)IT-Freigabe, iCal-Feed oder CalDAV — drei Wege zum Ziel. [Synchronisierung verstehen](/sync/how-it-works/)Richtung, Geschwindigkeit, Sichtbarkeitsstufen und Zeitfenster. [Syncs verwalten](/sharings/share-with-others/)Kalender teilen, eigene Kalender synchronisieren, pausieren und beenden. [KI-Assistent](/ki-assistent/)Claude mit deinen Kalendern verbinden — was er sehen und tun darf, entscheidest du pro Kalender. [Konto & Abrechnung](/account-billing/plans-limits/)Pläne, Testphase, Kündigung, Datenexport und Kontolöschung. [Datenschutz & IT-Admins](/privacy-it/security-overview/)Berechtigungen, AVV, Hosting in Deutschland — für IT und DSB. [Problemlösung](/troubleshooting/sync-not-working/)Sync läuft nicht? Checklisten, bekannte Einschränkungen und FAQ. Nichts gefunden? Nutze die Suche oben, sieh in die [bekannten Einschränkungen](/troubleshooting/known-limitations/) oder [kontaktiere uns](https://kalender-sync.de/kontakt/) — wir helfen gern weiter. # Ersten Kalender verbinden > Google, Microsoft, Apple iCloud, GMX, WEB.DE, mailbox.org, Posteo, STRATO, Disroot, KSuite oder iCal-Feed — welcher Weg passt zu deinem Kalender und was beim Verbinden passiert. Damit Kalender Sync arbeiten kann, verbindest du mindestens ein Kalenderkonto. Im Dashboard öffnest du dafür **„Kalender verbinden”** und wählst deinen Anbieter. ![Dialog „Kalender verbinden“ mit Google, Microsoft, Apple iCloud, GMX, WEB.DE, KSuite und iCal Feed](/images/app/de/connect-modal.webp) Der „Kalender verbinden“-Dialog im Dashboard mit allen verfügbaren Anbietern. ## Video: Kalender verbinden in 2 Minuten [Abschnitt betitelt „Video: Kalender verbinden in 2 Minuten“](#video-kalender-verbinden-in-2-minuten) ![Kalender verbinden in Kalender Sync – Google, Outlook & Apple in 2 Minuten](/images/video-posters/dmKnN72e0fc.jpg) Mit Klick auf Play wird YouTube geladen. Daten werden an Google übertragen.Cookie-Einstellungen öffnen ## Welcher Anbieter passt zu dir? [Abschnitt betitelt „Welcher Anbieter passt zu dir?“](#welcher-anbieter-passt-zu-dir) | Dein Kalender liegt bei … | Verbindungsart | Plan | Anleitung | | ----------------------------------------------------------------- | ------------------------------- | -------- | --------------------------------------------------------- | | ![](/images/icons/google.svg) Google / Gmail / Google Workspace | Konto-Login (OAuth) | Free | [Google verbinden](/connect-calendar/google/) | | ![](/images/icons/outlook.svg) Outlook / Microsoft 365 / Exchange | Konto-Login (OAuth) | Free | [Microsoft verbinden](/connect-calendar/microsoft/) | | ![](/images/icons/apple.svg) Apple / iPhone / iCloud | App-spezifisches Passwort | ab Basic | [Apple iCloud verbinden](/connect-calendar/apple-icloud/) | | ![](/images/icons/gmx.svg) GMX | Anwendungsspezifisches Passwort | ab Basic | [GMX verbinden](/connect-calendar/gmx/) | | ![](/images/icons/webde.svg) WEB.DE | Anwendungsspezifisches Passwort | ab Basic | [WEB.DE verbinden](/connect-calendar/webde/) | | ![](/images/icons/mailboxorg.svg) mailbox.org | App-Passwort | ab Basic | [mailbox.org verbinden](/connect-calendar/mailboxorg/) | | ![](/images/icons/posteo.svg) Posteo | App-Passwort | ab Basic | [Posteo verbinden](/connect-calendar/posteo/) | | ![](/images/icons/strato.png) STRATO (Webmail Premium/Business) | Postfach-Passwort | ab Basic | [STRATO verbinden](/connect-calendar/strato/) | | ![](/images/icons/disroot.png) Disroot | App-Passwort | ab Basic | [Disroot verbinden](/connect-calendar/nextcloud/disroot/) | | ![](/images/icons/ksuite.svg) Infomaniak / KSuite | App-Passwort | ab Basic | [KSuite verbinden](/connect-calendar/ksuite/) | | ![](/images/icons/ical.svg) Sonstiges mit iCal-/ICS-Link | Feed-URL (nur Quelle) | Basic | [iCal-Feed einbinden](/connect-calendar/ical-feed/) | Dein Anbieter fehlt? Schreib uns an — die meisten Anbieter können wir innerhalb weniger Tage freischalten. Anbieter, die dein aktueller Plan nicht enthält, erscheinen im Dialog ausgegraut mit Schloss-Symbol und Plan-Hinweis — ein Upgrade schaltet sie sofort frei ([Pläne & Limits](/account-billing/plans-limits/)). ## Was beim Verbinden passiert [Abschnitt betitelt „Was beim Verbinden passiert“](#was-beim-verbinden-passiert) **Google und Microsoft** öffnen ein Login-Fenster des Anbieters. Dort bestätigst du den Zugriff auf deine Kalender — Kalender Sync braucht Lese- **und** Schreibzugriff, um Blocker-Termine anlegen und wieder aufräumen zu können. Welche Berechtigungen genau angefragt werden und warum, steht unter [Berechtigungen im Detail](/privacy-it/permissions/). **Apple iCloud, GMX, WEB.DE, mailbox.org, Posteo, Disroot und KSuite** verbinden sich nicht per Login-Fenster, sondern mit einem **app-spezifischen Passwort**, das du vorher beim Anbieter erstellst — bei den meisten funktioniert dein normales Passwort dort bewusst nicht. **STRATO** ist die Ausnahme: Dort reicht dein normales Postfach-Passwort. Die Schritt-für-Schritt-Anleitung steht auf den jeweiligen Seiten. ## Kalender auswählen [Abschnitt betitelt „Kalender auswählen“](#kalender-auswählen) Nach dem Verbinden zeigt dir Kalender Sync alle Kalender des Kontos im Dialog **„Kalender auswählen”**. Hake nur die an, die du tatsächlich nutzen willst — du kannst die Auswahl später jederzeit in den Einstellungen ändern. ## Wenn es nicht klappt [Abschnitt betitelt „Wenn es nicht klappt“](#wenn-es-nicht-klappt) * Fehlermeldung wie „Zustimmung des Administrators erforderlich”? Deine Organisation blockiert die Verbindung — es gibt drei Auswege: [Meine Organisation blockiert die Verbindung](/connect-calendar/org-blocked/). * Andere Fehler beim Verbinden: [Verbindung schlägt fehl](/troubleshooting/connection-fails/). ## Weiter geht’s [Abschnitt betitelt „Weiter geht’s“](#weiter-gehts) Kalender verbunden? Dann richte jetzt deine [erste Freigabe](/getting-started/first-sharing/) ein. # Konto erstellen & anmelden > Anmeldung per E-Mail-Code, mit Google/Microsoft oder mit Passwort — und was beim ersten Login passiert. Bei Kalender Sync meldest du dich an, wie es dir am liebsten ist: klassisch mit E-Mail und Passwort, **ohne Passwort** per Einmal-Code — oder mit einem Klick über Google oder Microsoft. ![Kalender Sync Login-Seite mit Google/Microsoft-Buttons, E-Mail- und Passwort-Feld](/images/app/de/login.webp) Die Anmeldeseite: Google/Microsoft, E-Mail + Passwort — oder unten „Lieber per Code anmelden?“ Wenn du aus Claude oder ChatGPT kommst, testen wir mit Statistik-Einwilligung außerdem einen vereinfachten Einstieg: Google, Microsoft oder E-Mail-Code, ohne Passwortformular. Der Code meldet dich an oder erstellt nach Bestätigung ein Konto. Ein Passwort kannst du später unter **Einstellungen → Konto → Sicherheit → Passwort hinzufügen** einrichten. Die Kalenderverbindung und die Freigabe für den Assistenten bestätigst du weiterhin separat. ## Konto erstellen [Abschnitt betitelt „Konto erstellen“](#konto-erstellen) 1. Öffne [app.kalender-sync.de](https://app.kalender-sync.de/) und wähle **„Kostenlos starten”**. 2. Gib deine E-Mail-Adresse und ein Passwort ein (mindestens 10 Zeichen) — oder registriere dich direkt **mit Google/Microsoft**. 3. Zur Bestätigung erhältst du eine E-Mail mit einem **6-stelligen Code**. Code eingeben — fertig. Gut zu wissen zum Code: * Er ist **15 Minuten gültig**; danach forderst du einfach einen neuen an. * Nach **5 falschen Eingaben** wird er ungültig — auch dann hilft ein neuer Code. * Hast du mehrere angefordert, zählt immer der Code aus der **neuesten** E-Mail. * Die E-Mail enthält bewusst **nur den Code, keinen Klick-Link** — Links werden in vielen Firmen von Sicherheits-Scannern automatisch geöffnet und damit entwertet. ## Anmelden [Abschnitt betitelt „Anmelden“](#anmelden) Auf der Login-Seite hast du drei Wege: * **E-Mail + Passwort** — der Standardweg. * **„Lieber per Code anmelden?”** — passwortloser Login: Du bekommst einen 6-stelligen Code per E-Mail. Praktisch, wenn du dir kein Passwort merken willst. * **„Mit Google anmelden” / „Mit Microsoft anmelden”** — dabei wird nur deine Identität bestätigt; **es wird noch kein Kalender verbunden** (das ist ein separater Schritt mit eigener Zustimmung). Die Wege sind austauschbar: Meldest du dich mit Google an, obwohl du dich per E-Mail registriert hast (oder umgekehrt), landest du im selben Konto — entscheidend ist die **verifizierte E-Mail-Adresse**. **Passwort vergessen?** Auf der Login-Seite **„Passwort vergessen?”** wählen — du setzt es per E-Mail-Code neu. Ändern geht jederzeit unter Einstellungen → Konto → Sicherheit → **„Passwort ändern”**. ## Was nach der Registrierung passiert [Abschnitt betitelt „Was nach der Registrierung passiert“](#was-nach-der-registrierung-passiert) Beim ersten Login führt dich ein kurzes Onboarding durch: 1. **Über dich** — Name (optional) und die Zustimmung zu AGB und Datenschutzerklärung (erforderlich). Ein Newsletter-Häkchen ist optional. 2. **Testphase** — als neues Konto bekommst du eine kostenlose [7-tägige Testphase](/account-billing/trial/) geschenkt, ohne Kreditkarte. 3. Danach geht es direkt weiter zum [Verbinden deines ersten Kalenders](/getting-started/connect-first-calendar/). ![Onboarding-Schritt „Willkommen bei Kalender-Sync“ mit Namensfeldern und AGB-Checkbox](/images/app/de/onboarding.webp) Das Onboarding nach der Registrierung — Name ist optional, die AGB-Zustimmung erforderlich. ## Probleme bei der Anmeldung? [Abschnitt betitelt „Probleme bei der Anmeldung?“](#probleme-bei-der-anmeldung) Mail kommt nicht an, Code abgelaufen, kein Zugriff mehr aufs Postfach → [Anmeldeprobleme](/troubleshooting/login-issues/). # Erste Freigabe einrichten > Schritt für Schritt durch die geführte Einrichtung — Quellkalender wählen, Sichtbarkeit festlegen und teilen oder eigene Kalender koppeln. Eine **Freigabe** verbindet Quellkalender mit einem Ziel. Du startest sie im Dashboard über **„Neuer Sync”** (in der Seitenleiste: „Neue Synchronisation”) — danach wirst du Schritt für Schritt durch die Einrichtung geführt. Voraussetzung: mindestens ein [verbundener Kalender](/getting-started/connect-first-calendar/). Für das Koppeln eigener Kalender brauchst du zwei beschreibbare Kalender (ggf. aus zwei Konten). ## Video: Teilen ohne private Termine zu zeigen [Abschnitt betitelt „Video: Teilen ohne private Termine zu zeigen“](#video-teilen-ohne-private-termine-zu-zeigen) ![Kalender teilen, ohne private Termine zu zeigen – mit Kalender Sync](/images/video-posters/LkEv0Hgj82k.jpg) Mit Klick auf Play wird YouTube geladen. Daten werden an Google übertragen.Cookie-Einstellungen öffnen ## Schritt 1: Typ wählen [Abschnitt betitelt „Schritt 1: Typ wählen“](#schritt-1-typ-wählen) ![Schritt „Was möchtest du einrichten?“ mit den Karten „Kalender teilen“ und „Kalender synchronisieren“](/images/app/de/wizard-type.webp) Der erste Schritt: Kalender teilen oder eigene Kalender synchronisieren. Zwei Wege stehen zur Wahl: * **Kalender teilen** — deine Verfügbarkeiten gehen an eine andere Person. Sie erhält einen Einladungslink und wählt selbst ihren Zielkalender. * **Kalender synchronisieren** — du koppelst zwei eigene Kalender, in eine Richtung oder beide. Kein Einladungslink nötig. (Details: [eigene Kalender synchronisieren](/sharings/self-sync/) — dieser Artikel folgt dem Teilen-Weg.) ## Schritt 2: Kalender wählen [Abschnitt betitelt „Schritt 2: Kalender wählen“](#schritt-2-kalender-wählen) Wähle einen oder mehrere **Quellkalender** — auch quer über deine verbundenen Konten hinweg. Alle Belegungen aus diesen Kalendern fließen gebündelt in die Freigabe. Fehlt ein Kalender in der Liste? Über **„Kalender verbinden”** kannst du direkt an dieser Stelle ein weiteres Konto anschließen; dein Zwischenstand bleibt dabei erhalten. ## Schritt 3: Sichtbarkeit festlegen [Abschnitt betitelt „Schritt 3: Sichtbarkeit festlegen“](#schritt-3-sichtbarkeit-festlegen) ![Schritt „Sichtbarkeit“ mit den Stufen Nur belegt, Titel + Zeit und Alle Details samt Vorschau](/images/app/de/wizard-visibility.webp) Die drei Sichtbarkeitsstufen — rechts zeigt die Vorschau, was die Empfängerseite sieht. Jetzt entscheidest du, was die Empfängerseite sieht: | Stufe | Beschreibung | | ------------------------- | -------------------------------------------- | | **Nur belegt** (Standard) | Nur dass du beschäftigt bist — keine Details | | **Titel + Zeit** | Terminname sowie Start- und Endzeit | | **Alle Details** | Inkl. Ort, Beschreibung, Notizen und Links | Alle Details zu den Stufen und was nie übertragen wird: [Sichtbarkeitsstufen](/sync/visibility-levels/). Zwei optionale Feineinstellungen an dieser Stelle: * **Platzhalter-Titel** (bei „Nur belegt”): eigener Text statt „Geblockt” — z. B. „Privat” oder „Extern”. * **Ganztägige Ereignisse**: Standardmäßig werden sie **als frei behandelt** (Geburtstage und Feiertage blocken also keinen ganzen Tag). Du kannst stattdessen „Den ganzen Tag blockieren” wählen. Mehr unter [Ganztägige Termine](/sync/all-day-events/). Teilnehmerlisten und Daten Dritter werden grundsätzlich nie übertragen — unabhängig von der Stufe. ## Schritt 4: Freigabe verschicken [Abschnitt betitelt „Schritt 4: Freigabe verschicken“](#schritt-4-freigabe-verschicken) Zum Abschluss erstellst du die Freigabe und lädst die Empfängerseite ein — per kopierbarem **Einladungslink** oder direkt **per E-Mail**. Der Link ist **7 Tage gültig** und einmal verwendbar. Die Freigabe steht im Dashboard zunächst auf **„Ausstehend”**, bis die Einladung angenommen wurde — was die Empfängerseite dabei sieht, steht unter [Ich habe eine Einladung erhalten](/getting-started/received-invite/). Danach wechselt der Status auf **„Aktiv”**. ## Nach dem Einrichten [Abschnitt betitelt „Nach dem Einrichten“](#nach-dem-einrichten) * Die **erste Synchronisation** läuft im Hintergrund und kann je nach Terminanzahl einige Minuten dauern (bei großen Kalendern bis zu einer halben Stunde). Du bekommst eine E-Mail, sobald sie abgeschlossen ist. * Synchronisiert wird der Zeitraum von **3 Monaten in die Vergangenheit; in die Zukunft abhängig vom Plan: 6 Monate (Free & Basic) bzw. 18 Monate (Professional)** — ältere und fernere Termine bleiben außen vor ([Sync-Zeitfenster](/sync/sync-window/)). * Danach laufen Änderungen automatisch: bei Google/Microsoft nahezu sofort (in allen Plänen), bei Apple/KSuite/iCal-Feeds im Minuten-Rhythmus ([So funktioniert der Sync](/sync/how-it-works/)). Es kommt nichts an? → [Sync funktioniert nicht — Checkliste](/troubleshooting/sync-not-working/) # Ich habe eine Einladung erhalten > Jemand teilt seine Kalender-Verfügbarkeiten mit dir — so nimmst du die Einladung an und wählst, wo die Termine landen. Du hast eine E-Mail bekommen wie „**… möchte Kalender mit dir teilen**”? Dann möchte dir jemand seine Verfügbarkeiten freigeben: Die Termine der Person erscheinen künftig automatisch als Blocker in einem Kalender deiner Wahl. Diese Seite führt dich durch die Annahme — auch wenn du Kalender Sync noch nie benutzt hast. ## Was in der Einladung steckt [Abschnitt betitelt „Was in der Einladung steckt“](#was-in-der-einladung-steckt) Die E-Mail zeigt dir, **wer** teilt, **welche Kalender** betroffen sind und mit welcher **Sichtbarkeit** (z. B. „Nur Verfügbarkeit” — dann siehst du nur belegte Zeiten ohne Details). Mit **„Einladung annehmen”** startest du. Gut zu wissen: Der Link ist **7 Tage gültig** und nur **einmal** verwendbar. Bis du dich registrierst, bekommst du keine weiteren E-Mails. ## Einladung annehmen — Schritt für Schritt [Abschnitt betitelt „Einladung annehmen — Schritt für Schritt“](#einladung-annehmen--schritt-für-schritt) ![Annahme-Seite mit den Schritten Einladung, Kalender wählen und Fertig](/images/app/de/accept-invite.webp) Die Annahme führt durch drei Schritte: Einladung → Kalender wählen → Fertig. 1. **Link öffnen.** Du siehst, wer dir etwas freigeben möchte; die Annahme führt dich durch drei Schritte (**Einladung → Kalender wählen → Fertig**). 2. **Anmelden.** Falls du noch kein Konto hast, registrierst du dich kurz (kostenlos) — per E-Mail-Code oder mit Google/Microsoft ([so funktioniert die Anmeldung](/getting-started/create-account/)). Danach landest du wieder in der Einladung. 3. **Zielkalender wählen.** Du entscheidest, wo die Blocker landen: * **„Neuen Kalender erstellen”** (empfohlen) — Kalender Sync legt einen eigenen Kalender an, standardmäßig nach dem Absender benannt; den Namen kannst du frei ändern. So bleibt dein Hauptkalender unangetastet und du kannst die geteilten Termine jederzeit ein-/ausblenden. * **„Vorhandenen Kalender wählen”** — die Blocker landen in einem bestehenden Kalender. 4. **Fertig.** Die erste Synchronisation startet im Hintergrund und kann einige Minuten dauern — du bekommst eine E-Mail, sobald sie abgeschlossen ist. Noch kein Kalender verbunden? Um die Einladung anzunehmen, braucht Kalender Sync Zugriff auf einen **beschreibbaren Kalender** bei dir. Falls noch keiner verbunden ist, führt dich der Dialog direkt zum Verbinden — z. B. ein Google- oder Microsoft-Konto ([Anleitung](/getting-started/connect-first-calendar/)). Ziel auf einem Infomaniak-Konto (KSuite)? Bei Infomaniak funktioniert **„Neuen Kalender erstellen”** oft nicht (Meldung „Der Kalender konnte bei deinem Anbieter nicht angelegt werden”) — der Anbieter übernimmt extern angelegte Kalender nicht zuverlässig. Lege den Kalender in dem Fall direkt im Infomaniak Kalender an und wähle ihn dann über **„Vorhandenen Kalender wählen”** ([Details](/connect-calendar/ksuite/)). ## Was du siehst — und was nicht [Abschnitt betitelt „Was du siehst — und was nicht“](#was-du-siehst--und-was-nicht) * Je nach gewählter Sichtbarkeitsstufe siehst du nur „belegt”, Titel + Zeit oder alle Details — das bestimmt die teilende Person. * **Nie** übertragen werden Teilnehmerlisten, E-Mail-Adressen oder Zu-/Absagen. * Die empfangenen Blocker sind **nicht zum Bearbeiten gedacht**: Änderst oder löschst du sie, stellt der nächste Sync sie wieder her. Die Termine gehören der Quellseite. ## Freigabe wieder beenden [Abschnitt betitelt „Freigabe wieder beenden“](#freigabe-wieder-beenden) Du findest die Freigabe in deinem Dashboard unter **„Geteilt mit mir”**. Mit **„Beenden”** stoppst du sie jederzeit — alle von Kalender Sync angelegten Blocker werden dabei automatisch aus deinem Kalender entfernt. ## Link abgelaufen oder ungültig? [Abschnitt betitelt „Link abgelaufen oder ungültig?“](#link-abgelaufen-oder-ungültig) Erscheint „Ungültiger oder abgelaufener Einladungslink”, ist die 7-Tage-Frist vorbei oder der Link wurde schon verwendet. Bitte die absendende Person einfach, dir eine **neue Einladung** zu schicken. # Was ist Kalender Sync? > Kalender Sync überträgt Verfügbarkeiten zwischen Kalendern — DSGVO-konform und ohne private Details preiszugeben. Das Konzept in 2 Minuten. Kalender Sync hält deine Kalender gegenseitig auf dem Laufenden: Termine aus einem Kalender erscheinen automatisch als Blocker in einem anderen — bei dir selbst oder bei einer anderen Person. Du entscheidest dabei genau, wie viel sichtbar ist: nur „belegt”, Titel und Zeit, oder alle Details. Das löst das klassische Problem von mehreren Kalendern: Niemand bucht dir einen Termin in ein Zeitfenster, das in einem anderen Kalender längst belegt ist. ## Video: Kalender Sync erklärt [Abschnitt betitelt „Video: Kalender Sync erklärt“](#video-kalender-sync-erklärt) ![Kalender Sync erklärt](/images/landing/founder-poster.jpg) Mit Klick auf Play wird YouTube geladen. Daten werden an Google übertragen.Cookie-Einstellungen öffnen ## Zwei Wege, Kalender Sync zu nutzen [Abschnitt betitelt „Zwei Wege, Kalender Sync zu nutzen“](#zwei-wege-kalender-sync-zu-nutzen) * **[Kalender teilen](/sharings/share-with-others/)** — du gibst deine Verfügbarkeiten für eine andere Person frei (Kolleg:in, Partner:in, Assistenz). Die Person erhält eine Einladung per E-Mail und wählt selbst, in welchem Kalender deine Blocker landen. * **[Kalender synchronisieren](/sharings/self-sync/)** — du koppelst zwei eigene Kalender, z. B. Arbeit und privat. Wahlweise in eine Richtung oder in beide. Wichtig zu wissen: * Termine fließen immer von der **Quelle ins Ziel**. Sollen sich zwei Kalender gegenseitig blocken, richtest du den Sync in beide Richtungen ein. * Deine **Originaltermine werden nie verändert** — Kalender Sync legt nur eigene Blocker-Termine im Ziel an und verwaltet ausschließlich diese. * Beendest du einen Sync, werden alle von Kalender Sync erstellten Blocker im Ziel wieder **aufgeräumt**. ## Du bestimmst, was sichtbar ist [Abschnitt betitelt „Du bestimmst, was sichtbar ist“](#du-bestimmst-was-sichtbar-ist) Pro Sync wählst du eine von drei [Sichtbarkeitsstufen](/sync/visibility-levels/): | Stufe | Was im Ziel ankommt | | ------------------------- | ------------------------------------------------------------- | | **Nur belegt** (Standard) | Nur der Zeitraum, mit neutralem Titel — maximale Privatsphäre | | **Titel + Zeit** | Terminname sowie Start- und Endzeit | | **Alle Details** | Inkl. Ort, Beschreibung, Notizen und Links | Bei **keiner** Stufe werden Teilnehmerlisten, E-Mail-Adressen, Organisator:innen oder Zu-/Absagen übertragen — das sind Daten Dritter und bleiben außen vor. Mehr dazu unter [Sicherheit & Datenschutz](/privacy-it/security-overview/). ## Unterstützte Kalender [Abschnitt betitelt „Unterstützte Kalender“](#unterstützte-kalender) | Anbieter | Verbindung | Sync-Geschwindigkeit | | ------------------------------------------------------ | ----------------------------------- | -------------------- | | ![](/images/icons/google.svg) Google Kalender | Konto verbinden (OAuth) | nahezu sofort | | ![](/images/icons/outlook.svg) Microsoft Outlook / 365 | Konto verbinden (OAuth) | nahezu sofort | | ![](/images/icons/apple.svg) Apple iCloud | App-spezifisches Passwort | alle paar Minuten | | ![](/images/icons/gmx.svg) GMX | App-Passwort | alle paar Minuten | | ![](/images/icons/webde.svg) WEB.DE | App-Passwort | alle paar Minuten | | ![](/images/icons/mailboxorg.svg) mailbox.org | App-Passwort | alle paar Minuten | | ![](/images/icons/posteo.svg) Posteo | App-Passwort | alle paar Minuten | | ![](/images/icons/strato.png) STRATO | Postfach-Passwort | alle paar Minuten | | ![](/images/icons/disroot.png) Disroot | App-Passwort | alle paar Minuten | | ![](/images/icons/ksuite.svg) Infomaniak KSuite | App-Passwort | alle paar Minuten | | ![](/images/icons/ical.svg) iCal-/ICS-Feeds | Feed-URL (nur als Quelle, ab Basic) | alle paar Minuten | Google und Microsoft synchronisieren in **allen Plänen** nahezu sofort per Echtzeit-Webhook – auch im Free-Plan. Die CalDAV-Anbieter (iCloud, GMX, WEB.DE, mailbox.org, Posteo, STRATO, Disroot, KSuite) und iCal-Feeds sind ab dem **Basic-Plan** verfügbar. Dein Anbieter fehlt? Schreib uns an — dein Wunsch fließt direkt in die Priorisierung, und die meisten Anbieter können wir innerhalb weniger Tage freischalten. Details und Anleitungen findest du unter [Kalender verbinden](/getting-started/connect-first-calendar/). ## Was Kalender Sync bewusst nicht ist [Abschnitt betitelt „Was Kalender Sync bewusst nicht ist“](#was-kalender-sync-bewusst-nicht-ist) * **Kein Termin-Import**: Deine Kalender werden nicht zusammengelegt — jeder Kalender bleibt, wie er ist; es kommen nur Blocker dazu. * **Kein Buchungstool**: Kalender Sync verteilt keine Buchungslinks. Es sorgt dafür, dass Buchungstools und Kolleg:innen deine echte Verfügbarkeit sehen. * **Keine Datensammlung**: Termininhalte werden nicht dauerhaft gespeichert — sie fließen nur während des Syncs durch. Gehostet wird in Deutschland. ## Nächste Schritte [Abschnitt betitelt „Nächste Schritte“](#nächste-schritte) 1. [Konto erstellen & anmelden](/getting-started/create-account/) 2. [Ersten Kalender verbinden](/getting-started/connect-first-calendar/) 3. [Erste Freigabe einrichten](/getting-started/first-sharing/) Du hast eine **Einladung** erhalten? Dann geht’s hier entlang: [Ich habe eine Einladung erhalten](/getting-started/received-invite/). # Apple iCloud verbinden > iCloud-Kalender per app-spezifischem Passwort verbinden — Schritt für Schritt, inkl. der häufigsten Stolperfalle. BasicVerfügbar ab Basic·[Pläne vergleichen](https://kalender-sync.de/preise/) Apple bietet für Kalender-Apps kein Login-Fenster wie Google oder Microsoft — die Verbindung läuft über **CalDAV** mit einem **app-spezifischen Passwort**. Das klingt technischer als es ist: einmal erstellt, läuft alles automatisch. Der Sync ruft Änderungen **alle 5 Minuten** ab. Die häufigste Stolperfalle Dein **normales Apple-Passwort funktioniert hier nicht** — Apple verlangt für Dritt-Apps ein eigenes, app-spezifisches Passwort. Das erstellst du in zwei Minuten, so: ## 1. App-spezifisches Passwort erstellen [Abschnitt betitelt „1. App-spezifisches Passwort erstellen“](#1-app-spezifisches-passwort-erstellen) ![Dialog „Apple iCloud verbinden“ mit der Anleitung zum app-spezifischen Passwort](/images/app/de/apple-guide.webp) Kalender Sync zeigt dir die Schritte direkt im Verbinden-Dialog an. 1. Öffne [appleid.apple.com](https://appleid.apple.com/) und melde dich an. 2. Gehe zu **„Anmelden und Sicherheit”** → **„Anwendungsspezifische Passwörter”**. 3. Klicke auf **„+”** und erstelle ein Passwort, z. B. mit dem Namen „kalender-sync”. 4. Kopiere das generierte Passwort (Format: `xxxx-xxxx-xxxx-xxxx`). Voraussetzung: Auf deinem Apple-Konto ist die **Zwei-Faktor-Authentifizierung** aktiv (bei fast allen Konten der Fall — ohne sie bietet Apple keine app-spezifischen Passwörter an). ## 2. In Kalender Sync verbinden [Abschnitt betitelt „2. In Kalender Sync verbinden“](#2-in-kalender-sync-verbinden) ![Formular mit E-Mail-Adresse und anwendungsspezifischem Passwort](/images/app/de/apple-credentials.webp) E-Mail-Adresse der Apple-ID + app-spezifisches Passwort, dann „Testen & Verbinden“. 1. Im Dashboard **„Kalender verbinden”** → **„Apple iCloud”** → mit **„Weiter”** zur Eingabe. 2. **E-Mail-Adresse** deiner Apple-ID eingeben (z. B. `name@icloud.com`). 3. Das **app-spezifische Passwort** einfügen und auf **„Testen & Verbinden”** klicken — Kalender Sync prüft die Verbindung sofort. ## Wenn „Anmeldung fehlgeschlagen” erscheint [Abschnitt betitelt „Wenn „Anmeldung fehlgeschlagen” erscheint“](#wenn-anmeldung-fehlgeschlagen-erscheint) * Tippfehler im Passwort? Am besten frisch einfügen statt abtippen. * Wirklich das **app-spezifische** Passwort verwendet, nicht das normale? * Passwort zwischenzeitlich bei Apple widerrufen? Einfach ein neues erstellen (Schritt 1). ## Zugriff beenden [Abschnitt betitelt „Zugriff beenden“](#zugriff-beenden) In Kalender Sync: [Kalender entfernen](/connect-calendar/disconnect/). Zusätzlich kannst du das app-spezifische Passwort jederzeit auf [appleid.apple.com](https://appleid.apple.com/) löschen — damit endet der Zugriff sofort. # Kalender entfernen & Zugriff widerrufen > Einzelne Kalender oder Feeds aus Kalender Sync entfernen — und wie du den Zugriff eines Kontos vollständig widerrufst. ## Kalender oder Feed entfernen [Abschnitt betitelt „Kalender oder Feed entfernen“](#kalender-oder-feed-entfernen) 1. **Einstellungen → „Verbundene Kalender”** öffnen — dort erscheint jeder Kalender als Karte, auch iCal-Feeds. 2. Beim betreffenden Kalender das **Löschen** wählen. 3. Nutzt kein Sync diesen Kalender, bestätigst du nur kurz. Sind Syncs betroffen, listet der Dialog sie einzeln auf — „Beim Löschen von ‚X’ werden N Syncs beendet:” (z. B. „Automatischer Sync”, „Freigabe an …”, „Eingehende Freigabe von …”) — und du bestätigst mit **„Endgültig löschen”**. **Was dabei passiert:** * Die aufgelisteten Syncs werden beendet; alle von Kalender Sync erstellten **Blocker in den Zielkalendern werden aufgeräumt**. Deine Originaltermine bleiben unberührt. * Der Kalender verschwindet aus Kalender Sync — beim Anbieter existiert er selbstverständlich weiter. ## Wichtig: Das Konto bleibt verbunden [Abschnitt betitelt „Wichtig: Das Konto bleibt verbunden“](#wichtig-das-konto-bleibt-verbunden) Das Entfernen einzelner Kalender beendet deren Syncs, widerruft aber **nicht** den Zugriff des verbundenen Google-/Microsoft-Kontos. Wenn der Zugriff vollständig enden soll, hast du zwei Wege: * **Beim Anbieter widerrufen** (Tabelle unten) — wirkt sofort und unabhängig von Kalender Sync. * **[Konto löschen](/account-billing/export-delete/)** — widerruft im Zuge der Löschung automatisch alle Zugriffe. ## Zugriff beim Anbieter widerrufen [Abschnitt betitelt „Zugriff beim Anbieter widerrufen“](#zugriff-beim-anbieter-widerrufen) | Anbieter | Wo widerrufen | | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | Google | [myaccount.google.com/connections](https://myaccount.google.com/connections) | | Microsoft (privat) | [account.live.com/consent/Manage](https://account.live.com/consent/Manage) | | Microsoft (Arbeit/Schule) | [myapps.microsoft.com](https://myapps.microsoft.com/) | | Apple iCloud | App-spezifisches Passwort auf [appleid.apple.com](https://appleid.apple.com/) löschen | | Infomaniak KSuite | App-Passwort im [Manager](https://manager.infomaniak.com/) löschen | | iCal-Feed | Karte in Kalender Sync löschen genügt; zusätzlich kannst du die Adresse beim Anbieter zurücksetzen (z. B. Google: „Zurücksetzen” neben der Privatadresse) | Nach einem Widerruf beim Anbieter zeigt Kalender Sync das Konto als „Bitte neu verbinden” — betroffene Syncs pausieren, bis du neu verbindest oder die Kalender entfernst. ## Ganz aufräumen [Abschnitt betitelt „Ganz aufräumen“](#ganz-aufräumen) Soll das komplette Kalender-Sync-Konto weg (inkl. aller Daten und Zugriffe)? → [Daten exportieren & Konto löschen](/account-billing/export-delete/) # GMX verbinden > GMX-Kalender per anwendungsspezifischem Passwort verbinden — Schritt für Schritt. BasicVerfügbar ab Basic·[Pläne vergleichen](https://kalender-sync.de/preise/) GMX verbindest du über **CalDAV** mit deiner GMX-Adresse und einem **anwendungsspezifischen Passwort**. Das erstellst du in zwei Minuten direkt in deinen GMX-Einstellungen — danach läuft alles automatisch, der Sync ruft Änderungen **alle 5 Minuten** ab. Die häufigste Stolperfalle Für externe Programme wie Kalender Sync verlangt GMX ein **anwendungsspezifisches Passwort** — dein **normales GMX-Passwort funktioniert hier nicht**. ## 1. Anwendungsspezifisches Passwort erstellen [Abschnitt betitelt „1. Anwendungsspezifisches Passwort erstellen“](#1-anwendungsspezifisches-passwort-erstellen) 1. Öffne [account.gmx.net](https://account.gmx.net/), melde dich an und gehe zu **„Login & Sicherheit”**. 2. Scrolle zu **„Anwendungsspezifische Passwörter”** und klicke auf **„Anwendungsspezifische Passwörter verwalten”**. 3. Klicke auf **„Neues Anwendungsspezifisches Passwort erstellen”**, vergib einen Namen (z. B. „Kalender Sync”) und bestätige mit **„Weiter”**. 4. **Kopiere das angezeigte Passwort** — es wird dir aus Sicherheitsgründen nur einmal angezeigt. ## 2. In Kalender Sync verbinden [Abschnitt betitelt „2. In Kalender Sync verbinden“](#2-in-kalender-sync-verbinden) 1. Im Dashboard **„Kalender verbinden”** → **„GMX”** → mit **„Weiter”** zur Eingabe. 2. Deine **GMX-E-Mail-Adresse** eingeben (z. B. `name@gmx.de` oder `name@gmx.net`). 3. Das **anwendungsspezifische Passwort** einfügen und auf **„Testen & Verbinden”** klicken — Kalender Sync prüft die Verbindung sofort. ## Wenn „Anmeldung fehlgeschlagen” erscheint [Abschnitt betitelt „Wenn „Anmeldung fehlgeschlagen” erscheint“](#wenn-anmeldung-fehlgeschlagen-erscheint) * Wirklich das **anwendungsspezifische** Passwort verwendet, nicht das normale GMX-Passwort? * Das Passwort am besten frisch einfügen statt abtippen. * Passwort zwischenzeitlich in den GMX-Einstellungen gelöscht? Einfach ein neues erstellen (Schritt 1). ## Zugriff beenden [Abschnitt betitelt „Zugriff beenden“](#zugriff-beenden) In Kalender Sync: [Kalender entfernen](/connect-calendar/disconnect/). Zusätzlich kannst du das anwendungsspezifische Passwort jederzeit unter [account.gmx.net](https://account.gmx.net/) löschen — damit endet der Zugriff sofort. # Google Calendar verbinden > Google-Konto in einer Minute verbinden — was beim Login passiert, welche Berechtigungen nötig sind und was bei Problemen hilft. Google Calendar verbindest du per Konto-Login (OAuth) — ohne Passwörter bei uns zu hinterlegen. Verfügbar in allen Plänen. In allen Plänen läuft der Sync **nahezu sofort** per Echtzeit-Webhook (Änderungen werden von Google direkt gemeldet). ## Schritt für Schritt [Abschnitt betitelt „Schritt für Schritt“](#schritt-für-schritt) 1. Im Dashboard **„Kalender verbinden”** öffnen und **„Google Kalender”** wählen. 2. Im Google-Fenster das richtige Konto auswählen und anmelden. 3. Den Zugriff bestätigen — **alle Häkchen gesetzt lassen**. Entfernst du eines, schlägt der Sync später fehl und du musst neu verbinden. 4. Zurück in Kalender Sync: Im Dialog **„Kalender auswählen”** anhaken, welche Kalender du nutzen willst. Die Auswahl kannst du jederzeit in den Einstellungen ändern. ## Welche Berechtigungen werden angefragt — und warum? [Abschnitt betitelt „Welche Berechtigungen werden angefragt — und warum?“](#welche-berechtigungen-werden-angefragt--und-warum) | Berechtigung | Wofür | | -------------------------------- | -------------------------------------------------------------------- | | Kalender & Termine **lesen** | Deine Quelltermine erkennen und Änderungen mitbekommen | | Kalender & Termine **schreiben** | Blocker-Termine im Zielkalender anlegen, aktualisieren und aufräumen | | Basis-Profil (E-Mail) | Das Konto deinem Kalender-Sync-Konto zuordnen | Der Schreibzugriff ist nötig, obwohl deine Originaltermine **nie verändert** werden — Kalender Sync verwaltet ausschließlich die eigenen Blocker. Die vollständige Aufschlüsselung für IT und Datenschutz steht unter [Berechtigungen im Detail](/privacy-it/permissions/). ## Bekannte Stolperfallen [Abschnitt betitelt „Bekannte Stolperfallen“](#bekannte-stolperfallen) * **Falsches Konto vorausgewählt** — bist du im Browser mit mehreren Google-Konten angemeldet, prüfe die Kontoauswahl im Google-Fenster genau. Im Zweifel ein privates Browserfenster nutzen. * **Google Workspace: „App blockiert”** — dein Workspace-Admin hat Dritt-Apps eingeschränkt. Die Auswege: [Meine Organisation blockiert die Verbindung](/connect-calendar/org-blocked/). * **„Bitte neu verbinden” nach einigen Tagen** — der Zugriff ist abgelaufen oder wurde widerrufen: [Verbindung abgelaufen](/troubleshooting/reconnect/). ## Verbindung trennen [Abschnitt betitelt „Verbindung trennen“](#verbindung-trennen) Wie du Kalender wieder entfernst und den Zugriff widerrufst (und was mit abhängigen Syncs passiert): [Kalender entfernen & Zugriff widerrufen](/connect-calendar/disconnect/). Den Zugriff kannst du zusätzlich jederzeit bei Google selbst widerrufen: [myaccount.google.com/connections](https://myaccount.google.com/connections). # iCal-Feed als Quelle > Beliebige iCal-/ICS-Feeds als Quelle einbinden — inkl. Anleitung, die iCal-Adresse deines Kalenders in Google, Outlook und iCloud zu finden. BasicVerfügbar ab Basic·[Pläne vergleichen](https://kalender-sync.de/preise/) Kalender Sync kann jeden per HTTPS erreichbaren **iCal-/ICS-Feed** als Quelle einbinden. Damit holst du Kalender ins System, für die es keine native Integration gibt — und es ist der wichtigste **Fallback, wenn deine Organisation OAuth-Verbindungen blockiert** ([mehr dazu](/connect-calendar/org-blocked/)). ## Vorab wissen [Abschnitt betitelt „Vorab wissen“](#vorab-wissen) * Feeds sind **nur lesend**: Kalender Sync bezieht daraus Quelltermine, kann aber nichts in den Feed schreiben. Als **Zielkalender** brauchst du weiterhin ein verbundenes Konto. * Der Feed wird **alle 5 Minuten** abgerufen; je nach Anbieter kommt dessen eigenes Caching dazu (Outlook-Feeds aktualisieren teils träge). * Die Feed-URL enthält meist ein **Geheimnis (Token)** — behandle sie wie ein Passwort. Kalender Sync speichert sie verschlüsselt. ## Die iCal-Adresse deines Kalenders finden [Abschnitt betitelt „Die iCal-Adresse deines Kalenders finden“](#die-ical-adresse-deines-kalenders-finden) ### Google Kalender [Abschnitt betitelt „Google Kalender“](#google-kalender) 1. [Google Kalender im Web](https://calendar.google.com/) öffnen → Zahnrad → **Einstellungen**. 2. Links den gewünschten Kalender anklicken → Abschnitt **„Kalender integrieren”**. 3. Die **„Privatadresse im iCal-Format”** kopieren. Die Privatadresse (nicht die öffentliche Adresse) zeigt alle Termine. Du kannst sie bei Google jederzeit zurücksetzen, falls sie in falsche Hände gerät. ### Outlook / Microsoft 365 [Abschnitt betitelt „Outlook / Microsoft 365“](#outlook--microsoft-365) 1. [Outlook im Web](https://outlook.office.com/calendar/) öffnen → Zahnrad → **Kalender** → **„Geteilte Kalender”**. 2. Unter **„Einen Kalender veröffentlichen”** den Kalender und die Berechtigung wählen — **„Kann alle Details anzeigen”**, wenn Titel & Details übertragen werden sollen, sonst „Kann anzeigen, wenn ich beschäftigt bin”. 3. Den **ICS-Link** kopieren. Die gewählte Berechtigung bestimmt, was im Feed steckt — und damit das Maximum, das Kalender Sync lesen kann. Die [Sichtbarkeitsstufe](/sync/visibility-levels/) des Syncs kann es weiter einschränken, aber nicht erweitern. ### Apple iCloud [Abschnitt betitelt „Apple iCloud“](#apple-icloud) 1. [iCloud-Kalender](https://www.icloud.com/calendar/) öffnen → Teilen-Symbol neben dem Kalender. 2. **„Öffentlicher Kalender”** aktivieren und den Link kopieren. 3. `webcal://` musst du nicht ändern — Kalender Sync wandelt es automatisch in `https://` um. ## Feed in Kalender Sync einbinden [Abschnitt betitelt „Feed in Kalender Sync einbinden“](#feed-in-kalender-sync-einbinden) ![Dialog „iCal Feed hinzufügen“ mit Feed-URL-Feld](/images/app/de/ical-feed-modal.webp) Feed-URL einfügen — geprüft wird sofort beim Hinzufügen. 1. Im Dashboard **„Kalender verbinden”** → **„iCal Feed (URL)”**. 2. Die kopierte URL einfügen (nur HTTPS; `webcal://` wird automatisch konvertiert). 3. **„Testen & Hinzufügen”** — Kalender Sync ruft den Feed sofort ab und prüft ihn. Danach steht der Feed als **Quelle** in deinen Syncs zur Verfügung. ## Grenzen von Feeds [Abschnitt betitelt „Grenzen von Feeds“](#grenzen-von-feeds) * **Nur Quelle, nie Ziel** — in den blockierten Kalender zurück-syncen geht per Feed nicht. * **5-Minuten-Rhythmus** plus Anbieter-Caching statt Echtzeit. * Ein **iCal-Export** aus Kalender Sync heraus (eigene Feed-URL zum Abonnieren) existiert noch nicht → [Bekannte Einschränkungen](/troubleshooting/known-limitations/). ## Feed entfernen [Abschnitt betitelt „Feed entfernen“](#feed-entfernen) Feeds erscheinen unter **Einstellungen → „Verbundene Kalender”** als normale Kalender-Karte. Beim Löschen listet der Dialog alle betroffenen Syncs auf („Beim Löschen von ‚X’ werden N Syncs beendet”) und beendet sie sauber — die Blocker in den Zielkalendern werden aufgeräumt. Details: [Kalender entfernen](/connect-calendar/disconnect/). # KSuite (Infomaniak) verbinden > Infomaniak-Kalender per Benutzername und App-Passwort verbinden — Schritt für Schritt. BasicVerfügbar ab Basic·[Pläne vergleichen](https://kalender-sync.de/preise/) Infomaniak KSuite verbindest du über **CalDAV** mit deinem **Sync-Benutzernamen** und einem **App-Passwort** — beides findest du im Infomaniak-Manager. Der Sync ruft Änderungen **alle 5 Minuten** ab. Schön für datenschutzbewusste Setups: Infomaniak hostet wie wir in Europa. Zwei Stolperfallen Es ist **nicht** deine E-Mail-Adresse und **nicht** dein normales Infomaniak-Passwort: Die Verbindung braucht den **Sync-Benutzernamen** (z. B. `abc12345`) und ein eigens erstelltes **App-Passwort**. ## 1. Benutzername & App-Passwort vorbereiten [Abschnitt betitelt „1. Benutzername & App-Passwort vorbereiten“](#1-benutzername--app-passwort-vorbereiten) ![Dialog „KSuite (Infomaniak) verbinden“ mit der Anleitung zu Benutzername und App-Passwort](/images/app/de/ksuite-guide.webp) Die Schritte stehen auch direkt im Verbinden-Dialog. 1. Öffne [config.infomaniak.com](https://config.infomaniak.com/) und melde dich an. 2. Unter **„Manuelle Synchronisation”** findest du deinen **Benutzernamen** (z. B. `abc12345`). 3. Gehe dann zu [manager.infomaniak.com](https://manager.infomaniak.com/) → Profil → **„Sicherheit”** → **„App-Passwörter”**. 4. Erstelle ein neues App-Passwort, z. B. mit dem Namen „kalender-sync”. ## 2. In Kalender Sync verbinden [Abschnitt betitelt „2. In Kalender Sync verbinden“](#2-in-kalender-sync-verbinden) ![Formular mit Benutzername und App-Passwort](/images/app/de/ksuite-credentials.webp) Benutzername + App-Passwort, dann „Testen & Verbinden“. 1. Im Dashboard **„Kalender verbinden”** → **„Infomaniak KSuite”** → mit **„Weiter”** zur Eingabe. 2. **Benutzername** (nicht die E-Mail-Adresse!) und **App-Passwort** eingeben. 3. **„Testen & Verbinden”** — Kalender Sync prüft die Verbindung sofort. ## Wenn „Anmeldung fehlgeschlagen” erscheint [Abschnitt betitelt „Wenn „Anmeldung fehlgeschlagen” erscheint“](#wenn-anmeldung-fehlgeschlagen-erscheint) * Benutzername statt E-Mail-Adresse verwendet? * App-Passwort frisch eingefügt, nicht das Konto-Passwort? * Passwort im Manager widerrufen? Einfach ein neues erstellen (Schritt 1). ## „Neuen Kalender erstellen” schlägt fehl? [Abschnitt betitelt „„Neuen Kalender erstellen” schlägt fehl?“](#neuen-kalender-erstellen-schlägt-fehl) Erscheint beim Einrichten eines Syncs die Meldung **„Der Kalender konnte bei deinem Anbieter nicht angelegt werden”**, liegt das an einer Infomaniak-Besonderheit: Kalender, die von außen (per CalDAV) angelegt werden, übernimmt Infomaniak nicht zuverlässig — die Erstellung wird zwar bestätigt, der Kalender existiert danach aber nicht. Kalender Sync prüft das direkt beim Anlegen und bricht sauber ab, statt einen funktionslosen Sync einzurichten. **So klappt es trotzdem:** 1. Lege den Zielkalender direkt im [Infomaniak Kalender](https://calendar.infomaniak.com/) an. 2. Öffne in Kalender Sync den Sync-Assistenten erneut — der neue Kalender erscheint in der Auswahl (falls nicht: Kalenderliste über **„Verwalten”** aktualisieren). 3. Wähle **„Vorhandenen Kalender wählen”** und dort den neu angelegten Kalender. ## Zugriff beenden [Abschnitt betitelt „Zugriff beenden“](#zugriff-beenden) In Kalender Sync: [Kalender entfernen](/connect-calendar/disconnect/). Zusätzlich kannst du das App-Passwort jederzeit im [Infomaniak-Manager](https://manager.infomaniak.com/) löschen — damit endet der Zugriff sofort. # mailbox.org verbinden > mailbox.org-Kalender per App-Passwort über CalDAV verbinden — Schritt für Schritt. BasicVerfügbar ab Basic·[Pläne vergleichen](https://kalender-sync.de/preise/) mailbox.org verbindest du über **CalDAV** mit deiner mailbox.org-Adresse und einem **App-Passwort**. Das erstellst du in zwei Minuten direkt in deinen mailbox.org-Einstellungen — danach läuft alles automatisch, der Sync ruft Änderungen **alle 5 Minuten** ab. Die häufigste Stolperfalle Für externe Programme wie Kalender Sync legst du bei mailbox.org ein eigenes **App-Passwort** an. Hast du die **Zwei-Faktor-Authentisierung** aktiviert, ist es Pflicht — dein normales Passwort funktioniert dann hier nicht mehr. Ohne 2FA ist das App-Passwort optional, aber empfohlen. ## 1. App-Passwort erstellen [Abschnitt betitelt „1. App-Passwort erstellen“](#1-app-passwort-erstellen) 1. Melde dich bei mailbox.org an und öffne **„Einstellungen”** → **„Sicherheit”** → **„App-Passwörter”**. 2. Wähle als Anwendung **„Kalender- und Adressbuchclient (CalDAV/CardDAV)”** und vergib einen Namen (z. B. „Kalender Sync”). 3. Klicke auf **„Neues Passwort hinzufügen”**. 4. **Kopiere das angezeigte Passwort** — es wird dir aus Sicherheitsgründen nur einmal angezeigt. ## 2. In Kalender Sync verbinden [Abschnitt betitelt „2. In Kalender Sync verbinden“](#2-in-kalender-sync-verbinden) 1. Im Dashboard **„Kalender verbinden”** → **„mailbox.org”** → mit **„Weiter”** zur Eingabe. 2. Deine **mailbox.org-E-Mail-Adresse** eingeben (z. B. `name@mailbox.org`). 3. Das **App-Passwort** einfügen und auf **„Testen & Verbinden”** klicken — Kalender Sync prüft die Verbindung sofort. Die Serveradresse musst du nicht eingeben — Kalender Sync kennt sie und findet deine Kalender automatisch. ## Wenn „Anmeldung fehlgeschlagen” erscheint [Abschnitt betitelt „Wenn „Anmeldung fehlgeschlagen” erscheint“](#wenn-anmeldung-fehlgeschlagen-erscheint) * Wirklich das **App-Passwort** verwendet, nicht dein normales mailbox.org-Passwort? * Das Passwort am besten frisch einfügen statt abtippen. * Passwort zwischenzeitlich in den mailbox.org-Einstellungen gelöscht? Einfach ein neues erstellen (Schritt 1). Geburtstagskalender mailbox.org erzeugt automatisch einen **„Geburtstage”**-Kalender. Der ist bei mailbox.org schreibgeschützt — nutze ihn höchstens als **Quelle** für eine Einweg-Freigabe, nicht als Ziel eines Zwei-Wege-Syncs. ## Zugriff beenden [Abschnitt betitelt „Zugriff beenden“](#zugriff-beenden) In Kalender Sync: [Kalender entfernen](/connect-calendar/disconnect/). Zusätzlich kannst du das App-Passwort jederzeit in den mailbox.org-Einstellungen unter **„Sicherheit”** → **„App-Passwörter”** löschen — damit endet der Zugriff sofort. # Microsoft / Outlook verbinden > Microsoft 365, Outlook.com oder Exchange Online verbinden — inkl. Lösung für „Zustimmung des Administrators erforderlich". Outlook- und Microsoft-365-Kalender verbindest du per Konto-Login (OAuth). Verfügbar in allen Plänen. In allen Plänen läuft der Sync **nahezu sofort** per Echtzeit-Webhook (Änderungen werden von Microsoft direkt gemeldet). Das funktioniert mit privaten Konten (outlook.com, hotmail.de, live.de) genauso wie mit Arbeits- und Schulkonten (Microsoft 365 / Exchange Online). ## Schritt für Schritt [Abschnitt betitelt „Schritt für Schritt“](#schritt-für-schritt) 1. Im Dashboard **„Kalender verbinden”** öffnen und **„Microsoft Outlook”** wählen. 2. Im Microsoft-Fenster das richtige Konto auswählen und anmelden. 3. Den Zugriff bestätigen. 4. Zurück in Kalender Sync: Im Dialog **„Kalender auswählen”** anhaken, welche Kalender du nutzen willst. Die Auswahl kannst du jederzeit in den Einstellungen ändern. ## „Zustimmung des Administrators erforderlich”? [Abschnitt betitelt „„Zustimmung des Administrators erforderlich”?“](#zustimmung-des-administrators-erforderlich) Bei Arbeitskonten in strikt konfigurierten Microsoft-365-Umgebungen (häufig in Kanzleien, Beratungen und Konzernen) blockiert die IT den Zugriff von Dritt-Apps. Du erkennst es an einer Meldung wie **„Zustimmung des Administrators erforderlich”** / „Need admin approval” direkt im Microsoft-Login. Das ist kein Fehler von dir — und es gibt drei Auswege, von der 2-Minuten-Freigabe durch die IT bis zum iCal-Fallback ganz ohne IT: **[Meine Organisation blockiert die Verbindung](/connect-calendar/org-blocked/)**. ## Welche Berechtigungen werden angefragt — und warum? [Abschnitt betitelt „Welche Berechtigungen werden angefragt — und warum?“](#welche-berechtigungen-werden-angefragt--und-warum) | Berechtigung | Wofür | | ------------------------------------------------------ | --------------------------------------------------------------------------- | | Kalender **lesen & schreiben** (`Calendars.ReadWrite`) | Quelltermine lesen, Blocker im Ziel anlegen und aufräumen | | Basis-Profil (`User.Read`, E-Mail) | Das Konto deinem Kalender-Sync-Konto zuordnen | | Offline-Zugriff (`offline_access`) | Der Sync läuft im Hintergrund weiter, ohne dass du angemeldet bleiben musst | Kein Zugriff auf E-Mails, Dateien oder fremde Postfächer. Details für IT und Datenschutz: [Berechtigungen im Detail](/privacy-it/permissions/). ## Bekannte Stolperfallen [Abschnitt betitelt „Bekannte Stolperfallen“](#bekannte-stolperfallen) * **Mehrere Microsoft-Konten** — Microsoft meldet dich gern automatisch mit dem zuletzt genutzten Konto an. Prüfe die Kontoauswahl oder nutze ein privates Browserfenster. * **Falscher Mandant** — bei Arbeitskonten mit Gastzugängen in fremden Organisationen darauf achten, im eigenen Mandanten zu landen. * **„Bitte neu verbinden”** — Zugriff abgelaufen oder von der Org-Richtlinie zurückgesetzt: [Verbindung abgelaufen](/troubleshooting/reconnect/). ## Verbindung trennen [Abschnitt betitelt „Verbindung trennen“](#verbindung-trennen) Wie du Kalender wieder entfernst und den Zugriff widerrufst: [Kalender entfernen & Zugriff widerrufen](/connect-calendar/disconnect/). Zusätzlich kannst du den Zugriff bei Microsoft widerrufen — private Konten unter [account.live.com/consent/Manage](https://account.live.com/consent/Manage), Arbeitskonten unter [myapps.microsoft.com](https://myapps.microsoft.com/). # Disroot verbinden > Disroot-Kalender über CalDAV verbinden — mit deinem Disroot-Benutzernamen und einem App-Passwort aus der Disroot Cloud. BasicVerfügbar ab Basic·[Pläne vergleichen](https://kalender-sync.de/preise/) Deine Disroot-Kalender liegen in der **Disroot Cloud** (Nextcloud). Du verbindest sie über **CalDAV** — mit deinem **Disroot-Benutzernamen** und am besten einem **App-Passwort**. Danach läuft alles automatisch, der Sync ruft Änderungen **alle 5 Minuten** ab. Die häufigste Stolperfalle Der Login ist dein **Benutzername ohne `@disroot.org`** — also `name`, nicht `name@disroot.org`. Gibst du trotzdem die volle Adresse ein, kürzt Kalender Sync sie automatisch. ## 1. App-Passwort in der Disroot Cloud anlegen [Abschnitt betitelt „1. App-Passwort in der Disroot Cloud anlegen“](#1-app-passwort-in-der-disroot-cloud-anlegen) 1. Melde dich in der [Disroot Cloud](https://cloud.disroot.org/) an. 2. Öffne **Einstellungen → Sicherheit** und scrolle zu **Geräte & Sitzungen**. 3. Gib einen Namen ein, z. B. „Kalender Sync”, und klicke auf **Neues App-Passwort erstellen**. 4. Kopiere das angezeigte Passwort — es wird nur einmal angezeigt. Hast du die **Zwei-Faktor-Authentifizierung** aktiviert, ist das App-Passwort **Pflicht**. Ohne 2FA funktioniert auch dein normales Disroot-Passwort, das App-Passwort ist aber sicherer: Du kannst es später gezielt widerrufen, ohne dein Disroot-Passwort zu ändern. ## 2. In Kalender Sync verbinden [Abschnitt betitelt „2. In Kalender Sync verbinden“](#2-in-kalender-sync-verbinden) 1. Im Dashboard **„Kalender verbinden”** → **„Disroot”**. 2. Deinen **Disroot-Benutzernamen** eingeben (ohne `@disroot.org`). 3. Das **App-Passwort** eingeben und auf **„Testen & Verbinden”** klicken — Kalender Sync prüft die Verbindung sofort. Die Serveradresse (`cloud.disroot.org`) musst du nicht eingeben — Kalender Sync kennt sie und findet deine Kalender automatisch. Andere Nextcloud-Server Diese Anbindung gilt nur für Disroot. Eine eigene Nextcloud oder Nextcloud bei einem anderen Anbieter lässt sich derzeit nicht verbinden. ## Wenn „Anmeldung fehlgeschlagen” erscheint [Abschnitt betitelt „Wenn „Anmeldung fehlgeschlagen” erscheint“](#wenn-anmeldung-fehlgeschlagen-erscheint) * Klappt der Login mit denselben Daten in der [Disroot Cloud](https://cloud.disroot.org/)? Wenn nicht, liegt es an Benutzername oder Passwort. * Zwei-Faktor-Authentifizierung aktiv? Dann geht nur ein **App-Passwort**, nicht dein normales Passwort. * Hast du das App-Passwort in der Disroot Cloud gelöscht oder dein Passwort geändert? Dann die Verbindung mit einem neuen App-Passwort erneut herstellen. Klappt es trotzdem nicht, schreib uns an — die Disroot-Anbindung ist noch neu, jede Rückmeldung hilft. ## Zugriff beenden [Abschnitt betitelt „Zugriff beenden“](#zugriff-beenden) In Kalender Sync: [Kalender entfernen](/connect-calendar/disconnect/). Zusätzlich kannst du das App-Passwort in der Disroot Cloud unter **Einstellungen → Sicherheit → Geräte & Sitzungen** löschen — damit endet der Zugriff sofort. # Meine Organisation blockiert die Verbindung > Microsoft oder Google lässt die Verbindung nicht zu? Drei Wege zum Ziel — IT-Freigabe, iCal-Feed oder CalDAV. In vielen Unternehmen — besonders Kanzleien, Beratungen und Konzernen — blockiert die IT-Abteilung Verbindungen zu Dritt-Apps pauschal. Die gute Nachricht: **Es gibt immer einen Weg.** Diese Seite zeigt alle drei — die schnellste zuerst. ## Woran erkenne ich das? [Abschnitt betitelt „Woran erkenne ich das?“](#woran-erkenne-ich-das) * **Microsoft 365**: Direkt im Microsoft-Login erscheint **„Zustimmung des Administrators erforderlich”** bzw. „Need admin approval” — oft mit einem Feld, um eine Begründung an die IT zu schicken. * **Google Workspace**: Eine Meldung wie **„Zugriff blockiert: Die Anwendung wurde noch nicht von deinem Administrator überprüft”** bzw. „App ist blockiert”. Erscheint stattdessen ein anderer Fehler (abgebrochener Login, falsches Konto), schau zuerst in [Verbindung schlägt fehl](/troubleshooting/connection-fails/). ## Option A: iCal-Feed als Quelle — ohne IT, sofort [Abschnitt betitelt „Option A: iCal-Feed als Quelle — ohne IT, sofort“](#option-a-ical-feed-als-quelle--ohne-it-sofort) Die **iCal-Adresse** deines Kalenders funktioniert ohne jede OAuth-Freigabe — sie ist ein einfacher, schreibgeschützter Link, den dir Outlook und Google selbst anbieten. 1. ICS-URL kopieren — [Anleitung je Anbieter](/connect-calendar/ical-feed/#die-ical-adresse-deines-kalenders-finden). 2. In Kalender Sync als [iCal-Feed-Quelle](/connect-calendar/ical-feed/) einfügen (ab Basic). 3. Sync mit dem Feed als Quelle anlegen — fertig. **Typisches Setup:** Der blockierte Firmenkalender wird per Feed zur Quelle und blockt deinen privaten Google-Kalender — niemand bucht dich mehr doppelt. Die ehrliche Einordnung der Grenzen: Der blockierte Kalender kann so nur **Quelle** sein, nicht Ziel (Feeds sind schreibgeschützt), und der Sync läuft im 5-Minuten-Rhythmus statt sekundenschnell. ## Option B: IT-Freigabe anfordern — der saubere Weg [Abschnitt betitelt „Option B: IT-Freigabe anfordern — der saubere Weg“](#option-b-it-freigabe-anfordern--der-saubere-weg) Ein Admin gibt Kalender Sync **einmalig für die ganze Organisation** frei; danach kann sich jede:r normal verbinden. Der Aufwand für die IT: **etwa zwei Minuten.** Alles, was deine IT dafür braucht, steht gesammelt auf **[kalender-sync.de/it-admin](https://kalender-sync.de/it-admin/)**: der Microsoft-Admin-Consent-Link zum Anklicken, die angefragten Berechtigungen im Detail, AVV nach Art. 28 DSGVO, Subprozessoren und Hosting-Infos für das Compliance-Review. Vorlage zum Kopieren für deine Anfrage: ```text Betreff: Freigabe der App „Kalender-Sync" (2 Minuten, Microsoft 365 / Google Workspace) Hallo IT-Team, ich möchte Kalender-Sync (kalender-sync.de) nutzen, um Kalender- Verfügbarkeiten DSGVO-konform zu synchronisieren. Beim Verbinden meines Kontos erscheint „Zustimmung des Administrators erforderlich". Könnt ihr die App bitte für unsere Organisation freigeben? Alle Informationen für euer Review — Berechtigungen, AVV nach Art. 28 DSGVO, Subprozessoren, Hosting in Deutschland — sowie der Admin-Consent-Link stehen hier: https://kalender-sync.de/it-admin/ Danke! ``` Für **Google Workspace** läuft die Freigabe über die Admin-Konsole (Sicherheit → API-Steuerung → Drittanbieter-App-Zugriff) — auch dazu findet deine IT die Details auf der IT-Admin-Seite. ## Option C: CalDAV — wenn Apple oder Infomaniak im Spiel ist [Abschnitt betitelt „Option C: CalDAV — wenn Apple oder Infomaniak im Spiel ist“](#option-c-caldav--wenn-apple-oder-infomaniak-im-spiel-ist) Liegt einer deiner Kalender bei **iCloud**, **GMX**, **WEB.DE**, **mailbox.org**, **Posteo**, **STRATO**, **Disroot** oder **Infomaniak KSuite**, braucht es gar kein OAuth: Diese Verbindungen laufen über App-Passwörter, die du selbst erstellst — keine IT nötig. Anleitungen: [Apple iCloud](/connect-calendar/apple-icloud/), [GMX](/connect-calendar/gmx/), [WEB.DE](/connect-calendar/webde/), [mailbox.org](/connect-calendar/mailboxorg/), [Disroot](/connect-calendar/nextcloud/disroot/), [KSuite](/connect-calendar/ksuite/). ## Welche Option passt? [Abschnitt betitelt „Welche Option passt?“](#welche-option-passt) | Deine Situation | Empfehlung | | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | Sofort loslegen, der blockierte Kalender soll andere blocken | **Option A** — iCal-Feed als Quelle | | IT ist ansprechbar, volle Funktionalität gewünscht | **Option B** — voller Funktionsumfang deines Plans (Echtzeit-Sync; ab Basic auch in beide Richtungen) | | Sync soll **in** den blockierten Kalender schreiben, IT bleibt hart | Aktuell nur Option B; ein iCal-Export aus Kalender Sync ist geplant → [Bekannte Einschränkungen](/troubleshooting/known-limitations/) | | iCloud-/KSuite-Kalender beteiligt | **Option C** — App-Passwort statt OAuth | Du kommst nicht weiter? [Schreib uns](/troubleshooting/contact-support/) — blockierte Organisationen sind ein Thema, bei dem wir gern persönlich helfen. # Posteo verbinden > Posteo-Kalender per App-Passwort über CalDAV verbinden — Schritt für Schritt. BasicVerfügbar ab Basic·[Pläne vergleichen](https://kalender-sync.de/preise/) Posteo verbindest du über **CalDAV** mit deiner Posteo-Adresse und einem **App-Passwort**. Das erstellst du in zwei Minuten in deinen Posteo-Einstellungen — danach läuft alles automatisch, der Sync ruft Änderungen **alle 5 Minuten** ab. Warum ein App-Passwort? Posteo empfiehlt für Kalender-Programme ein eigenes **App-Passwort**. Dein normales Posteo-Passwort funktioniert zwar auch, aber ein App-Passwort gilt nur für externe Programme, lässt sich jederzeit einzeln löschen und bleibt gültig, wenn du dein Hauptpasswort änderst. ## 1. App-Passwort erstellen [Abschnitt betitelt „1. App-Passwort erstellen“](#1-app-passwort-erstellen) 1. Melde dich bei [posteo.de](https://posteo.de/) an und öffne **„Einstellungen”** → **„Mein Konto”** → **„Passwort und Sicherheit”**. 2. Im Bereich **App-Passwörter (Gerätepasswörter)** ein neues App-Passwort erstellen. 3. Vergib eine Beschreibung (z. B. „Kalender Sync”) und übernimm das vorgeschlagene Passwort. 4. Bestätige mit deinem Posteo-Passwort und **kopiere das App-Passwort** — Posteo zeigt es aus Sicherheitsgründen nur einmal an. ## 2. In Kalender Sync verbinden [Abschnitt betitelt „2. In Kalender Sync verbinden“](#2-in-kalender-sync-verbinden) 1. Im Dashboard **„Kalender verbinden”** → **„Posteo”** → mit **„Weiter”** zur Eingabe. 2. Deine **vollständige Posteo-Adresse** eingeben (z. B. `name@posteo.de`). 3. Das **App-Passwort** (oder dein normales Posteo-Passwort) einfügen und auf **„Testen & Verbinden”** klicken — Kalender Sync prüft die Verbindung sofort. Die Serveradresse musst du nicht eingeben — Kalender Sync kennt sie und findet deine Kalender automatisch. ## Wenn „Anmeldung fehlgeschlagen” erscheint [Abschnitt betitelt „Wenn „Anmeldung fehlgeschlagen” erscheint“](#wenn-anmeldung-fehlgeschlagen-erscheint) * Die **komplette Adresse** inklusive `@posteo.de` (bzw. deiner Posteo-Alias-Domain) eingegeben? * Das App-Passwort frisch einfügen statt abtippen — es ist mindestens 16 Zeichen lang. * Ist bei Posteo der **zusätzliche Postfachschutz** aktiv? Er ist laut Posteo nur für Webmail gedacht und sperrt externe Programme. Schalte ihn aus, wenn du Kalender Sync nutzen willst. * Passwort zwischenzeitlich gelöscht oder per „Passwort vergessen” zurückgesetzt? Ein Reset löscht alle App-Passwörter — einfach ein neues erstellen (Schritt 1). Klappt es trotzdem nicht, schreib uns an — die Posteo-Anbindung ist noch neu, jede Rückmeldung hilft. ## Zugriff beenden [Abschnitt betitelt „Zugriff beenden“](#zugriff-beenden) In Kalender Sync: [Kalender entfernen](/connect-calendar/disconnect/). Zusätzlich kannst du das App-Passwort jederzeit unter **„Passwort und Sicherheit”** → **„App-Passwörter”** löschen — damit endet der Zugriff sofort. # STRATO verbinden > STRATO-Postfach-Kalender über CalDAV verbinden — mit Postfach-Adresse und Postfach-Passwort. BasicVerfügbar ab Basic·[Pläne vergleichen](https://kalender-sync.de/preise/) Den Kalender deines STRATO-Postfachs verbindest du über **CalDAV** — mit der **Adresse deines Postfachs** und dem **Postfach-Passwort**. Vorab musst du nichts anlegen. Danach läuft alles automatisch, der Sync ruft Änderungen **alle 5 Minuten** ab. Die häufigste Stolperfalle Gemeint ist das Passwort deines **E-Mail-Postfachs** — nicht das Passwort für den STRATO-Kundenlogin, mit dem du Verträge und Domains verwaltest. Und die Adresse liegt bei STRATO meist auf **deiner eigenen Domain** (z. B. `name@deine-firma.de`), nicht auf `@strato.de`. ## Voraussetzung [Abschnitt betitelt „Voraussetzung“](#voraussetzung) Du brauchst ein STRATO-Postfach **mit Kalender** — das ist bei **Webmail Premium** und **Webmail Business** dabei. Prüfen kannst du es in [STRATO Webmail](https://webmail.strato.de/): Siehst du dort nach dem Login einen Kalender, passt es. ## In Kalender Sync verbinden [Abschnitt betitelt „In Kalender Sync verbinden“](#in-kalender-sync-verbinden) 1. Im Dashboard **„Kalender verbinden”** → **„STRATO”**. 2. Die **vollständige Postfach-Adresse** eingeben — genau die, mit der du dich bei STRATO Webmail anmeldest. 3. Das **Postfach-Passwort** eingeben und auf **„Testen & Verbinden”** klicken — Kalender Sync prüft die Verbindung sofort. Die Serveradresse (`dav.webmail.strato.de`) musst du nicht eingeben — Kalender Sync kennt sie und findet deine Kalender automatisch. Lieber ein eigenes Passwort nur für Kalender Sync? STRATO Webmail bietet zusätzlich **Applikationspasswörter** an. Nötig sind sie nicht, aber du kannst eines anlegen und hier statt des Postfach-Passworts verwenden. Dann kannst du den Zugriff später gezielt widerrufen, ohne dein Postfach-Passwort zu ändern. ## Wenn „Anmeldung fehlgeschlagen” erscheint [Abschnitt betitelt „Wenn „Anmeldung fehlgeschlagen” erscheint“](#wenn-anmeldung-fehlgeschlagen-erscheint) * Klappt der Login mit denselben Daten bei [webmail.strato.de](https://webmail.strato.de/)? Wenn nicht, liegt es an Adresse oder Passwort. * Wirklich das **Postfach-Passwort** verwendet, nicht das Kundenlogin-Passwort? * Hast du das Postfach-Passwort kürzlich geändert? Dann die Verbindung mit dem neuen Passwort erneut herstellen. * Kein Kalender gefunden? Dann enthält dein Tarif vermutlich keinen Kalender (siehe Voraussetzung). Klappt es trotzdem nicht, schreib uns an — die STRATO-Anbindung ist noch neu, jede Rückmeldung hilft. ## Zugriff beenden [Abschnitt betitelt „Zugriff beenden“](#zugriff-beenden) In Kalender Sync: [Kalender entfernen](/connect-calendar/disconnect/). Hast du ein Applikationspasswort verwendet, kannst du es zusätzlich in STRATO Webmail löschen — damit endet der Zugriff sofort. Mit dem Postfach-Passwort endet er, sobald du es änderst. # WEB.DE verbinden > WEB.DE-Kalender per anwendungsspezifischem Passwort verbinden — Schritt für Schritt. BasicVerfügbar ab Basic·[Pläne vergleichen](https://kalender-sync.de/preise/) WEB.DE verbindest du über **CalDAV** mit deiner WEB.DE-Adresse und einem **anwendungsspezifischen Passwort**. Das erstellst du in zwei Minuten direkt in deinen WEB.DE-Einstellungen — danach läuft alles automatisch, der Sync ruft Änderungen **alle 5 Minuten** ab. Die häufigste Stolperfalle Für externe Programme wie Kalender Sync verlangt WEB.DE ein **anwendungsspezifisches Passwort** — dein **normales WEB.DE-Passwort funktioniert hier nicht**. ## 1. Anwendungsspezifisches Passwort erstellen [Abschnitt betitelt „1. Anwendungsspezifisches Passwort erstellen“](#1-anwendungsspezifisches-passwort-erstellen) 1. Öffne [account.web.de](https://account.web.de/), melde dich an und gehe zu **„Login & Sicherheit”**. 2. Scrolle zu **„Anwendungsspezifische Passwörter”** und klicke auf **„Anwendungsspezifische Passwörter verwalten”**. 3. Klicke auf **„Neues Anwendungsspezifisches Passwort erstellen”**, vergib einen Namen (z. B. „Kalender Sync”) und bestätige mit **„Weiter”**. 4. **Kopiere das angezeigte Passwort** — es wird dir aus Sicherheitsgründen nur einmal angezeigt. ## 2. In Kalender Sync verbinden [Abschnitt betitelt „2. In Kalender Sync verbinden“](#2-in-kalender-sync-verbinden) 1. Im Dashboard **„Kalender verbinden”** → **„WEB.DE”** → mit **„Weiter”** zur Eingabe. 2. Deine **WEB.DE-E-Mail-Adresse** eingeben (z. B. `name@web.de`). 3. Das **anwendungsspezifische Passwort** einfügen und auf **„Testen & Verbinden”** klicken — Kalender Sync prüft die Verbindung sofort. ## Wenn „Anmeldung fehlgeschlagen” erscheint [Abschnitt betitelt „Wenn „Anmeldung fehlgeschlagen” erscheint“](#wenn-anmeldung-fehlgeschlagen-erscheint) * Wirklich das **anwendungsspezifische** Passwort verwendet, nicht das normale WEB.DE-Passwort? * Das Passwort am besten frisch einfügen statt abtippen. * Passwort zwischenzeitlich in den WEB.DE-Einstellungen gelöscht? Einfach ein neues erstellen (Schritt 1). ## Zugriff beenden [Abschnitt betitelt „Zugriff beenden“](#zugriff-beenden) In Kalender Sync: [Kalender entfernen](/connect-calendar/disconnect/). Zusätzlich kannst du das anwendungsspezifische Passwort jederzeit unter [account.web.de](https://account.web.de/) löschen — damit endet der Zugriff sofort. # KI-Assistent verbinden > Einen KI-Assistenten wie Claude an deine Kalender anbinden — was er sehen und tun darf, entscheidest du pro Kalender. Kein Passwort, jederzeit widerrufbar. Du kannst einen KI-Assistenten (etwa Claude von Anthropic oder ChatGPT über das Plugin-Verzeichnis) mit deinen Kalendern verbinden. Er beantwortet dann Fragen zu deiner Verfügbarkeit — „Bin ich Donnerstag um 14 Uhr frei?”, „Wo habe ich diese Woche zwei Stunden am Stück?” — und legt auf Wunsch auch Termine an. Unterstützt sind **Claude, Claude Code, ChatGPT und Codex** (Anmeldung per Browser-Fenster) sowie **Cursor, Grok und OpenClaw** (per Zugriffs-Schlüssel). Auch **Automatisierungs-Tools mit MCP-Unterstützung** kannst du anbinden: [n8n](/ki-assistent/n8n/) und [Zapier](/ki-assistent/zapier/) haben eigene Anleitungen. Einen Überblick mit allen Vorteilen findest du auf der [Produktseite](https://kalender-sync.de/mcp/). Das Besondere: **du entscheidest pro Kalender, was der Assistent sehen und tun darf.** Nicht freigegebene Kalender existieren für ihn nicht. ## Video: In 7 Minuten erklärt [Abschnitt betitelt „Video: In 7 Minuten erklärt“](#video-in-7-minuten-erklärt) Der komplette Durchlauf — alle drei Wege (Claude, Claude Code, ChatGPT), Kalender-Freigabe, erster Termin per Prompt und das Zugriffsprotokoll: ![KI-Assistent mit deinem Kalender verbinden – Claude, Claude Code & ChatGPT | Kalender Sync](/images/video-posters/YtrJTj3ZtwE.jpg) Mit Klick auf Play wird YouTube geladen. Daten werden an Google übertragen.Cookie-Einstellungen öffnen ## Was der Assistent kann [Abschnitt betitelt „Was der Assistent kann“](#was-der-assistent-kann) * **Verfügbarkeit lesen** — direkt beim Anbieter (Google, Outlook, iCloud, GMX, …), nicht aus einer Kopie. Wie viel Detail er je Kalender bekommt, legst du fest: nur ob du geblockt bist, Titel und Zeit, oder alle Details. → [Was der Assistent sieht](/ki-assistent/sichtbarkeit/) * **Termine finden** — „Wann ist mein Zahnarzt-Termin?”, „Wann war das Meeting mit Julius?” — durchsucht Titel, Ort und Beschreibung deiner Termine. Nur in Kalendern, deren Sichtbarkeitsstufe Titel zeigt; „Nur Geblockt”-Kalender sind nicht durchsuchbar. → [Was der Assistent sieht](/ki-assistent/sichtbarkeit/) * **Termine anlegen und verwalten** (in jedem Tarif) — auf deine Bitte hin trägt er Termine ein und verwaltet die, die er selbst angelegt hat. Mit zusätzlicher Freigabe auch bestehende eigene Termine und Einladungen — bei Google, Microsoft und den CalDAV-Anbietern. → [Schreibzugriff](/ki-assistent/schreibzugriff/) * **Syncs verwalten** — er zeigt deine Syncs, erklärt, warum einer hakt, und legt nach deiner Bestätigung neue Ein- oder Zwei-Wege-Syncs zwischen deinen eigenen Kalendern an, pausiert oder löscht sie. → [Syncs per KI-Assistent](/ki-assistent/syncs/) * **Feedback senden** — fehlt dir eine Funktion, kann der Assistent uns das auf deine Bitte hin direkt melden. Wenn du magst, melden wir uns einmalig dazu zurück. Alle Tools im technischen Detail: [Für Entwickler: Tool-Referenz](/ki-assistent/tool-referenz/). ## Was in deiner Hand bleibt [Abschnitt betitelt „Was in deiner Hand bleibt“](#was-in-deiner-hand-bleibt) * **Du bestätigst die Kalender und Rechte selbst.** Bei neuen Verbindungen sind nur Hauptkalender vorausgewählt, mit den maximal verfügbaren Rechten. Weitere Kalender lassen sich hinzufügen; **das Regler-Symbol neben der Zugriffsangabe** passt die Rechte pro Kalender an. Ohne deine abschließende Freigabe entsteht kein Zugriff. * **Du kannst den Zugang jederzeit entziehen** — ein Klick auf der Seite „KI-Assistent”, und der Zugang ist sofort tot. Es gibt auch einen Not-Aus, der alle Zugänge auf einmal widerruft. * **Jede Abfrage wird protokolliert** — nur *dass* und *was* abgefragt wurde, nie der Inhalt deiner Termine. Ab Professional kannst du das Protokoll als CSV exportieren. * **Der Zugang läuft automatisch ab**, wenn er längere Zeit nicht genutzt wird. ## Neu angelegte Kalender [Abschnitt betitelt „Neu angelegte Kalender“](#neu-angelegte-kalender) Legst du **nach dem Verbinden** bei deinem Anbieter einen neuen Kalender an, sieht der Assistent ihn nicht automatisch. Eine Freigabe gilt nur für die Kalender, die du ausgewählt hast, und neue kommen nie ungefragt dazu. * **Kalender Sync findet ihn von selbst.** Alle paar Stunden schauen wir bei deinen verbundenen Konten nach neuen Kalendern. Dann erscheint im Dashboard und unter **KI-Assistent** der Hinweis **„N neue Kalender gefunden”**. Mit **Prüfen** legst du fest, ob du ihn in Kalender Sync anzeigen und welchem Assistenten du ihn freigeben willst. Ein angehakter Kalender bekommt vollen Zugriff, soweit dein Tarif und der Kalender es erlauben; das Regler-Symbol schränkt ihn ein. **Nicht jetzt** blendet den Hinweis für diese Kalender aus. * **Sofort statt in ein paar Stunden:** unter **KI-Assistent → Freigabe bearbeiten** (und auf der Freigabeseite beim Verbinden) auf **„Fehlt ein Kalender? Nach neuen Kalendern suchen”**. Beim Verbinden sind neu gefundene Kalender mit **„Neu”** markiert. * **Der Assistent sagt Bescheid.** Gibt es neue Kalender, die noch nicht freigegeben sind, nennt `list_calendars` ihre **Anzahl** und wo du sie freigibst, aber nie ihre Namen. Änderungen an der Freigabe wirken sofort. Ein neuer Schlüssel oder eine neue Verbindung ist nicht nötig. ## Assistent verbinden [Abschnitt betitelt „Assistent verbinden“](#assistent-verbinden) Wähle deinen Assistenten — jeder Weg führt zur selben Freigabe: * ![](/icons/claude.svg) [Mit Claude verbinden](/ki-assistent/claude/) — über das Connector-Verzeichnis in Claude (der einfachste Weg). * ![](/icons/claude-code.svg) [Mit Claude Code verbinden](/ki-assistent/claude-code/) — im Terminal, per Befehl. * ![](/icons/chatgpt.svg) [Mit ChatGPT verbinden](/ki-assistent/chatgpt/) — über das Plugin-Verzeichnis. * ![](/icons/codex.svg) [Mit Codex verbinden](/ki-assistent/codex/) — über dasselbe Plugin-Verzeichnis, in der CLI per Schlüssel. * ![](/icons/cursor.svg) [Mit Cursor verbinden](/ki-assistent/cursor/) — per Schlüssel in der mcp.json. * ![](/icons/grok.svg) [Mit Grok verbinden](/ki-assistent/grok/) — Grok Build (CLI), per Schlüssel. * ![](/icons/openclaw.svg) [Mit OpenClaw verbinden](/ki-assistent/openclaw/) — per Schlüssel, optional mit Skill. * [Mit n8n verbinden](/ki-assistent/n8n/) — KI-Agent-Workflows mit Kalenderzugriff, per Schlüssel. * [Mit Zapier verbinden](/ki-assistent/zapier/) — Kalender-Tools als normale Zap-Steps, ganz ohne KI-Modell. ## Zugang widerrufen [Abschnitt betitelt „Zugang widerrufen“](#zugang-widerrufen) Du entziehst einem Assistenten den Zugriff jederzeit selbst — der Widerruf in Kalender Sync ist der maßgebliche, unabhängig davon, was im Assistenten selbst passiert: * **Einzeln:** unter **KI-Assistent** beim jeweiligen Zugang auf **Widerrufen**. Sofort wirksam, alle Tokens dieses Zugangs sind damit tot. * **Not-Aus:** ein Klick widerruft **alle** Zugänge auf einmal. Einen Connector nur im Assistenten (Claude, ChatGPT) zu entfernen, trennt ihn dort lokal — der Zugang bei uns bleibt bis zum Widerruf in Kalender Sync (oder bis er nach längerer Nichtnutzung automatisch abläuft). # Mit ChatGPT verbinden > Kalender Sync in ChatGPT einrichten — über das Plugin-Verzeichnis in wenigen Klicks, alternativ über den Entwicklermodus. [![](/icons/chatgpt.svg)Kalender Sync in ChatGPT öffnen](https://chatgpt.com/plugins/plugin_asdk_app_6a789d2ee20c8191a7abd7c3736a7c2c) Kalender Sync steht im **Plugin-Verzeichnis von ChatGPT**. Du öffnest das Plugin, fügst es hinzu und bestätigst bei uns die Freigabe — das ist alles. Dasselbe Verzeichnis nutzt auch [Codex](/ki-assistent/codex/). ## Schritt für Schritt [Abschnitt betitelt „Schritt für Schritt“](#schritt-für-schritt) 1. Öffne [Kalender Sync im Plugin-Verzeichnis](https://chatgpt.com/plugins/plugin_asdk_app_6a789d2ee20c8191a7abd7c3736a7c2c) (oder suche in ChatGPT unter **Plugins** nach „Kalender Sync“) und füge das Plugin hinzu. 2. ChatGPT leitet dich zu unserer Anmeldung. Hast du noch kein Konto, legst du es dort direkt an (7 Tage gratis, keine Kreditkarte) und verbindest deine Kalender. 3. Bestätige auf dem **Zustimmungs-Bildschirm** die Freigabe — Kalender auswählen, Detailtiefe je Kalender einstellen. Erst jetzt entsteht der Zugang. Bei einer **neuen Assistenten-Verbindung** ist pro Konto nur der vom Anbieter gekennzeichnete **Hauptkalender** vorausgewählt, soweit die Tarifgrenze reicht. Weitere Kalender kannst du anhaken. Ohne gekennzeichneten Hauptkalender wählst du selbst. Ausgewählte Kalender starten mit den maximal verfügbaren Rechten; **das Regler-Symbol neben der Zugriffsangabe** öffnet je Kalender die Detailtiefe sowie Schreib- und Verwaltungsrechte. Mit **Freigeben** bestätigst du die Auswahl. Falls ein Tarifangebot erscheint, kannst du es direkt überspringen. Danach wird der Zugriff erteilt; die Abschlussseite zeigt Beispiel-Prompts und einen App-Link. Sie leitet nach acht Sekunden zum Assistenten zurück, oder sofort über den Zurück-Button. Bestehende Freigaben behalten beim erneuten Verbinden ihre bisherigen Rechte, soweit sie weiterhin verfügbar sind. Danach kannst du im Chat nach deiner Verfügbarkeit fragen („Bin ich morgen um 14 Uhr frei?”) oder Termine suchen lassen („Wann ist mein Zahnarzt-Termin?”). ## Alternative: über den Entwicklermodus [Abschnitt betitelt „Alternative: über den Entwicklermodus“](#alternative-über-den-entwicklermodus) Falls das Plugin-Verzeichnis in deinem Konto nicht verfügbar ist, bindest du Kalender Sync als eigenes Plugin ein. Fortgeschritten — Entwicklermodus nötig Der Entwicklermodus ist eine Beta-Funktion und mit „Erhöhtes Risiko” gekennzeichnet — du fügst damit nicht von OpenAI geprüfte Verbindungen hinzu. Für Kalender Sync ist das unbedenklich (du gibst wie überall pro Kalender frei, was der Assistent sehen darf), aber es ist ein Weg für technisch versierte Nutzer. Die Adresse (MCP-Server-URL), die du einträgst, ist: ```plaintext https://app.kalender-sync.de/mcp ``` ### Video: ChatGPT verbinden [Abschnitt betitelt „Video: ChatGPT verbinden“](#video-chatgpt-verbinden) Das Video zeigt diesen Weg und startet direkt beim ChatGPT-Kapitel des Tutorials: ![KI-Assistent mit deinem Kalender verbinden – Kapitel: ChatGPT](/images/video-posters/YtrJTj3ZtwE.jpg) Mit Klick auf Play wird YouTube geladen. Daten werden an Google übertragen.Cookie-Einstellungen öffnen ### 1. Entwicklermodus aktivieren [Abschnitt betitelt „1. Entwicklermodus aktivieren“](#1-entwicklermodus-aktivieren) Öffne in ChatGPT **Einstellungen → Plugins** und ganz unten **Entwicklermodus**. ![ChatGPT-Einstellungen: Plugins mit dem Eintrag „Entwicklermodus" unten](/images/ki-assistent/01-devmode-open-de.png) Schalte **Entwicklermodus** ein und bestätige den Risiko-Hinweis. ![Der Entwicklermodus-Schalter ist aktiviert](/images/ki-assistent/02-devmode-on-de.png) ### 2. Plugin hinzufügen [Abschnitt betitelt „2. Plugin hinzufügen“](#2-plugin-hinzufügen) Geh auf die **Plugins**-Seite und klicke oben rechts auf **+**. ![Die Plugins-Übersicht in ChatGPT mit dem Plus-Button](/images/ki-assistent/03-plugins-de.png) Im Dialog **„Neues Plugin”**: * **Name:** z. B. `Kalender Sync` * **Verbindung:** `Server URL` gewählt lassen, oben kopierte Adresse eintragen * **Authentifizierung:** `OAuth` * Den Risiko-Hinweis bestätigen und hinzufügen. ![Der Dialog „Neues Plugin" mit Server-URL und OAuth](/images/ki-assistent/04-add-plugin-de.png) ### 3. Freigeben [Abschnitt betitelt „3. Freigeben“](#3-freigeben) ChatGPT leitet dich zu unserem **Zustimmungs-Bildschirm**. Melde dich an, wähle die Kalender und die Detailtiefe je Kalender — erst mit dieser Bestätigung entsteht der Zugang. Danach kannst du im Chat nach deiner Verfügbarkeit fragen („Bin ich morgen um 14 Uhr frei?”) oder Termine suchen lassen („Wann ist mein Zahnarzt-Termin?”). ## Verbindung wieder trennen [Abschnitt betitelt „Verbindung wieder trennen“](#verbindung-wieder-trennen) Das Plugin in ChatGPT zu entfernen trennt es nur dort. Der maßgebliche Widerruf ist der in Kalender Sync unter **KI-Assistent → Widerrufen** → [Zugang widerrufen](/ki-assistent/#zugang-widerrufen). # Mit Claude verbinden > Kalender Sync steht im Connector-Verzeichnis von Claude. In wenigen Klicks verbinden — die Freigabe bestätigst du auf unserem Zustimmungs-Bildschirm. [![](/icons/claude.svg)Kalender Sync in Claude öffnen](https://claude.ai/directory/connectors/kalender-sync) Kalender Sync ist im **Connector-Verzeichnis von Claude** gelistet. Du suchst den Connector direkt in Claude und klickst auf Verbinden — mehr braucht es nicht. Der Assistent bekommt **nichts**, solange du die Freigabe nicht auf unserem Zustimmungs-Bildschirm bestätigst. Dort wählst du die Kalender aus und stellst pro Kalender die Detailtiefe (und ggf. den Schreibzugriff) ein. Du musst deine Kalender **nicht vorher** in der App verbinden: Falls noch keiner da ist, kannst du das direkt auf dem Zustimmungs-Bildschirm nachholen. Bei einer **neuen Assistenten-Verbindung** ist pro Konto nur der vom Anbieter gekennzeichnete **Hauptkalender** vorausgewählt, soweit die Tarifgrenze reicht. Weitere Kalender kannst du anhaken. Ohne gekennzeichneten Hauptkalender wählst du selbst. Ausgewählte Kalender starten mit den maximal verfügbaren Rechten; **das Regler-Symbol neben der Zugriffsangabe** öffnet je Kalender die Detailtiefe sowie Schreib- und Verwaltungsrechte. Mit **Freigeben** bestätigst du die Auswahl. Falls ein Tarifangebot erscheint, kannst du es direkt überspringen. Danach wird der Zugriff erteilt; die Abschlussseite zeigt Beispiel-Prompts und einen App-Link. Sie leitet nach acht Sekunden zum Assistenten zurück, oder sofort über den Zurück-Button. Bestehende Freigaben behalten beim erneuten Verbinden ihre bisherigen Rechte, soweit sie weiterhin verfügbar sind. ## Video: Claude verbinden [Abschnitt betitelt „Video: Claude verbinden“](#video-claude-verbinden) Das Video startet direkt beim Claude-Kapitel des Tutorials. Es zeigt noch den früheren Weg über einen selbst eingetragenen Connector — unser Zustimmungs-Bildschirm ist inzwischen vereinfacht; die aktuelle Auswahl ist oben beschrieben: ![KI-Assistent mit deinem Kalender verbinden – Kapitel: Claude verbinden](/images/video-posters/YtrJTj3ZtwE.jpg) Mit Klick auf Play wird YouTube geladen. Daten werden an Google übertragen.Cookie-Einstellungen öffnen ## Schritt für Schritt [Abschnitt betitelt „Schritt für Schritt“](#schritt-für-schritt) 1. Öffne in Claude die **Connectors** und suche nach **Kalender Sync**. Alternativ öffnest du den Eintrag direkt im [Connector-Verzeichnis](https://claude.ai/directory/connectors/kalender-sync). 2. Klicke auf **Verbinden**. Claude weist dich darauf hin, dass es sich um einen Community-Connector handelt, den Anthropic nicht im Detail geprüft hat. Das ist bei allen Connectors so, die nicht von Anthropic selbst stammen. Bestätige den Hinweis. 3. Claude schickt dich zu Kalender Sync auf den **Zustimmungs-Bildschirm**. Melde dich an und bestätige die Freigabe. Erst jetzt entsteht der Zugang. Auf dem Zustimmungs-Bildschirm legst du fest: * **Kalender verbinden**, falls du noch keinen verbunden hast — Google, Microsoft 365, Apple iCloud, GMX, WEB.DE, mailbox.org, Posteo, STRATO, Disroot und Infomaniak kSuite stehen zur Auswahl. * **Welche Kalender** Kalender Sync überhaupt nutzen darf. * **Die Detailtiefe je Kalender** — nur „Geblockt”, Titel und Zeit, oder alle Details. Und auf Wunsch den Schreibzugriff. Danach kannst du Claude im Chat nach deiner Verfügbarkeit fragen („Bin ich Donnerstag frei?”), Termine finden lassen („Wann ist mein Zahnarzt-Termin?”) — und auf Wunsch [Termine anlegen lassen](/ki-assistent/schreibzugriff/). ## Alternative: Connector von Hand eintragen [Abschnitt betitelt „Alternative: Connector von Hand eintragen“](#alternative-connector-von-hand-eintragen) Wo das Verzeichnis nicht zur Verfügung steht (etwa in manchen Desktop- oder Unternehmens-Umgebungen), trägst du Kalender Sync von Hand ein. In Claude unter **Einstellungen → Connectors → Eigenen Connector hinzufügen** diese Adresse eintragen: ```plaintext https://app.kalender-sync.de/mcp ``` Ab da läuft alles gleich: Claude schickt dich auf unseren Zustimmungs-Bildschirm, dort bestätigst du die Freigabe. ## Verbindung wieder trennen [Abschnitt betitelt „Verbindung wieder trennen“](#verbindung-wieder-trennen) In Kalender Sync unter **KI-Assistent** beim Zugang auf **Widerrufen** — sofort wirksam. Mehr dazu unter [Zugang widerrufen](/ki-assistent/#zugang-widerrufen). # Mit Claude Code verbinden > Kalender Sync als MCP-Server in Claude Code (Terminal) einrichten — ein Befehl, danach die Freigabe bestätigen. Für Claude Code (das Terminal-Werkzeug) reicht ein Befehl. Die genaue Adresse wird dir in der App unter **KI-Assistent → „Assistent verbinden” → Claude Code** angezeigt. Bei einer **neuen Assistenten-Verbindung** ist pro Konto nur der vom Anbieter gekennzeichnete **Hauptkalender** vorausgewählt, soweit die Tarifgrenze reicht. Weitere Kalender kannst du anhaken. Ohne gekennzeichneten Hauptkalender wählst du selbst. Ausgewählte Kalender starten mit den maximal verfügbaren Rechten; **das Regler-Symbol neben der Zugriffsangabe** öffnet je Kalender die Detailtiefe sowie Schreib- und Verwaltungsrechte. Mit **Freigeben** bestätigst du die Auswahl. Falls ein Tarifangebot erscheint, kannst du es direkt überspringen. Danach wird der Zugriff erteilt; die Abschlussseite zeigt Beispiel-Prompts und einen App-Link. Sie leitet nach acht Sekunden zum Assistenten zurück, oder sofort über den Zurück-Button. Bestehende Freigaben behalten beim erneuten Verbinden ihre bisherigen Rechte, soweit sie weiterhin verfügbar sind. ## Video: Claude Code verbinden [Abschnitt betitelt „Video: Claude Code verbinden“](#video-claude-code-verbinden) Das Video startet direkt beim Claude-Code-Kapitel — vom Befehl im Terminal bis zum ersten Termin per Prompt: ![KI-Assistent mit deinem Kalender verbinden – Kapitel: Claude Code](/images/video-posters/YtrJTj3ZtwE.jpg) Mit Klick auf Play wird YouTube geladen. Daten werden an Google übertragen.Cookie-Einstellungen öffnen ## Schritt für Schritt [Abschnitt betitelt „Schritt für Schritt“](#schritt-für-schritt) 1. Führe diesen Befehl in deinem Projekt aus: ```bash claude mcp add --transport http kalender-sync https://app.kalender-sync.de/mcp ``` 2. Starte Claude Code und tippe `/mcp`. Wähle dort **kalender-sync** und dann **Authenticate** — das öffnet unsere Anmeldung im Browser. 3. Melde dich an und bestätige auf dem **Zustimmungs-Bildschirm** die Freigabe — Kalender auswählen, Detailtiefe je Kalender einstellen. Erst jetzt entsteht der Zugang. Danach kannst du direkt loslegen, z. B.: *„Welche Kalender sind über Kalender Sync freigegeben?”*, *„Wo habe ich diese Woche zwei Stunden am Stück?”* oder *„Wann ist mein Zahnarzt-Termin?”* ## Verbindung wieder trennen [Abschnitt betitelt „Verbindung wieder trennen“](#verbindung-wieder-trennen) `claude mcp remove kalender-sync` entfernt den Server **nur lokal** in Claude Code. Der maßgebliche Widerruf ist der in Kalender Sync unter **KI-Assistent → Widerrufen** → [Zugang widerrufen](/ki-assistent/#zugang-widerrufen). # Mit Codex verbinden > Kalender Sync in Codex einrichten — über das Plugin-Verzeichnis, das Codex mit ChatGPT teilt, oder in der Codex-CLI per Zugriffs-Schlüssel. [![](/icons/codex.svg)Kalender Sync als Plugin öffnen](https://chatgpt.com/plugins/plugin_asdk_app_6a789d2ee20c8191a7abd7c3736a7c2c) Codex nutzt **dasselbe Plugin-Verzeichnis wie ChatGPT**. Du fügst Kalender Sync dort einmal hinzu und bestätigst bei uns die Freigabe. ## Schritt für Schritt [Abschnitt betitelt „Schritt für Schritt“](#schritt-für-schritt) 1. Öffne [Kalender Sync im Plugin-Verzeichnis](https://chatgpt.com/plugins/plugin_asdk_app_6a789d2ee20c8191a7abd7c3736a7c2c) (oder suche in Codex bzw. ChatGPT unter **Plugins** nach „Kalender Sync“) und füge das Plugin hinzu. 2. Du wirst zu unserer Anmeldung geleitet. Hast du noch kein Konto, legst du es dort direkt an (7 Tage gratis, keine Kreditkarte) und verbindest deine Kalender. 3. Bestätige auf dem **Zustimmungs-Bildschirm** die Freigabe — Kalender auswählen, Detailtiefe je Kalender einstellen. Erst jetzt entsteht der Zugang. Bei einer **neuen Assistenten-Verbindung** ist pro Konto nur der vom Anbieter gekennzeichnete **Hauptkalender** vorausgewählt, soweit die Tarifgrenze reicht. Weitere Kalender kannst du anhaken. Ohne gekennzeichneten Hauptkalender wählst du selbst. Ausgewählte Kalender starten mit den maximal verfügbaren Rechten; **das Regler-Symbol neben der Zugriffsangabe** öffnet je Kalender die Detailtiefe sowie Schreib- und Verwaltungsrechte. Mit **Freigeben** bestätigst du die Auswahl. Falls ein Tarifangebot erscheint, kannst du es direkt überspringen. Danach wird der Zugriff erteilt; die Abschlussseite zeigt Beispiel-Prompts und einen App-Link. Sie leitet nach acht Sekunden zum Assistenten zurück, oder sofort über den Zurück-Button. Bestehende Freigaben behalten beim erneuten Verbinden ihre bisherigen Rechte, soweit sie weiterhin verfügbar sind. Danach kannst du loslegen, z. B.: *„Welche Kalender sind über Kalender Sync freigegeben?”*, *„Wo habe ich diese Woche zwei Stunden am Stück?”* oder *„Wann ist mein Zahnarzt-Termin?”* ## Alternative: Codex-CLI mit Zugriffs-Schlüssel [Abschnitt betitelt „Alternative: Codex-CLI mit Zugriffs-Schlüssel“](#alternative-codex-cli-mit-zugriffs-schlüssel) Die Anmeldung per Browser-Fenster (`codex mcp login`) nehmen wir derzeit nur von Claude und ChatGPT an. In der Codex-CLI verbindest du Kalender Sync deshalb mit einem Zugriffs-Schlüssel: 1. In der App **KI-Assistent → Assistent verbinden → Etwas anderes** öffnen, Kalender und Detailtiefe wählen und mit **Schlüssel erstellen** den Schlüssel (`ksa_…`) erzeugen. Er wird nur einmal angezeigt — behandle ihn wie ein Passwort. 2. Den Schlüssel als Umgebungsvariable `KALENDER_SYNC_KEY` setzen. 3. In `~/.codex/config.toml` ergänzen: ```toml [mcp_servers.kalender-sync] url = "https://app.kalender-sync.de/mcp" bearer_token_env_var = "KALENDER_SYNC_KEY" ``` ## Zugang widerrufen [Abschnitt betitelt „Zugang widerrufen“](#zugang-widerrufen) In Kalender Sync unter **KI-Assistent** beim Zugang auf **Widerrufen** — sofort wirksam, der Schlüssel ist damit ungültig, egal was in Codex gespeichert ist. Mehr dazu unter [Zugang widerrufen](/ki-assistent/#zugang-widerrufen). # Mit Cursor verbinden > Kalender Sync als MCP-Server in Cursor einrichten — mit Zugriffs-Schlüssel und einem Eintrag in der mcp.json. In Cursor bindest du Kalender Sync als Remote-MCP-Server ein. Danach kennt der Agent in Cursor deine Kalender über alle verbundenen Anbieter — Google, Outlook, iCloud, GMX, WEB.DE und mehr. ## 1. Zugang und Schlüssel in Kalender Sync erstellen [Abschnitt betitelt „1. Zugang und Schlüssel in Kalender Sync erstellen“](#1-zugang-und-schlüssel-in-kalender-sync-erstellen) Noch kein Konto? Lege es unter [app.kalender-sync.de](https://app.kalender-sync.de/) an (7 Tage Professional gratis, keine Kreditkarte) und [verbinde deine Kalender](/getting-started/connect-first-calendar/). Öffne in der App **KI-Assistent → Assistent verbinden** und wähle **Etwas anderes**. Wie bei jedem Zugang wählst du die Kalender einzeln aus und stellst je Kalender die [Detailtiefe](/ki-assistent/sichtbarkeit/) ein — nicht freigegebene Kalender existieren für Cursor nicht. Mit **Schlüssel erstellen** bekommst du deinen Zugriffs-Schlüssel (ein Token, beginnt mit `ksa_`). Er wird **nur einmal angezeigt**. Behandle ihn wie ein Passwort: Wer den Schlüssel hat, hat genau den Zugriff, den du diesem Zugang gegeben hast. Füge ihn nie in einen Chat ein. Warum ein Schlüssel und kein Anmeldefenster? Cursor verbindet sich mit einem Zugriffs-Schlüssel. Claude und ChatGPT nutzen die Anmeldung per Browser-Fenster (OAuth). Für dich ändert das nichts an den Rechten: Du bestimmst weiterhin je Kalender, was sichtbar ist und ob Termine angelegt werden dürfen. ## 2. Kalender Sync in Cursor eintragen [Abschnitt betitelt „2. Kalender Sync in Cursor eintragen“](#2-kalender-sync-in-cursor-eintragen) 1. Lege den Schlüssel als Umgebungsvariable `KALENDER_SYNC_KEY` in deinem Shell-Profil oder Systemumfeld ab (Cursor liest bei Remote-Servern keine `envFile`). Alternativ trägst du ihn direkt statt `${env:KALENDER_SYNC_KEY}` ein — dann gehört die Datei nicht in ein Git-Repository. 2. Ergänze in `~/.cursor/mcp.json` (für alle Projekte) oder `.cursor/mcp.json` (nur dieses Projekt) den Eintrag. Bestehende Server bleiben erhalten: ```json { "mcpServers": { "kalender-sync": { "url": "https://app.kalender-sync.de/mcp", "headers": { "Authorization": "Bearer ${env:KALENDER_SYNC_KEY}" } } } } ``` 3. Cursor neu laden. Unter **Settings → MCP** sollte **kalender-sync** mit seinen Tools erscheinen. Danach kannst du loslegen, z. B.: *„Welche Kalender sind über Kalender Sync freigegeben?”*, *„Wo habe ich diese Woche zwei Stunden am Stück?”* oder *„Wann ist mein Zahnarzt-Termin?”* ## Wenn etwas nicht klappt [Abschnitt betitelt „Wenn etwas nicht klappt“](#wenn-etwas-nicht-klappt) * **401 / „Unauthorized“:** Schlüssel falsch, abgelaufen oder widerrufen. Prüfe den Header: Name exakt `Authorization`, Wert `Bearer ksa_…` (mit Leerzeichen). Im Zweifel einen neuen Schlüssel erstellen. * **Ein Kalender fehlt:** Er ist für diesen Zugang nicht freigegeben. Ergänze ihn in der App unter **KI-Assistent → Freigabe bearbeiten** — das wirkt sofort, ein neuer Schlüssel ist nicht nötig. Hast du ihn erst nach dem Verbinden angelegt: [Neu angelegte Kalender](/ki-assistent/#neu-angelegte-kalender). ## Zugang widerrufen [Abschnitt betitelt „Zugang widerrufen“](#zugang-widerrufen) In Kalender Sync unter **KI-Assistent** beim Zugang auf **Widerrufen** — sofort wirksam, der Schlüssel ist damit ungültig, egal was in Cursor gespeichert ist. Mehr dazu unter [Zugang widerrufen](/ki-assistent/#zugang-widerrufen). # Mit Grok verbinden > Kalender Sync in Grok Build (CLI) einrichten — mit Zugriffs-Schlüssel und einem Befehl. In **Grok Build**, dem Terminal-Werkzeug von xAI, bindest du Kalender Sync als Remote-MCP-Server ein. Nur Grok Build Die Grok-App (Desktop, iOS, Web) kann Kalender Sync derzeit nicht einbinden. Diese Anleitung gilt nur für die Kommandozeile Grok Build. ## 1. Zugang und Schlüssel in Kalender Sync erstellen [Abschnitt betitelt „1. Zugang und Schlüssel in Kalender Sync erstellen“](#1-zugang-und-schlüssel-in-kalender-sync-erstellen) Noch kein Konto? Lege es unter [app.kalender-sync.de](https://app.kalender-sync.de/) an (7 Tage Professional gratis, keine Kreditkarte) und [verbinde deine Kalender](/getting-started/connect-first-calendar/). Öffne in der App **KI-Assistent → Assistent verbinden** und wähle **Etwas anderes**. Wie bei jedem Zugang wählst du die Kalender einzeln aus und stellst je Kalender die [Detailtiefe](/ki-assistent/sichtbarkeit/) ein — nicht freigegebene Kalender existieren für Grok nicht. Mit **Schlüssel erstellen** bekommst du deinen Zugriffs-Schlüssel (ein Token, beginnt mit `ksa_`). Er wird **nur einmal angezeigt**. Behandle ihn wie ein Passwort: Wer den Schlüssel hat, hat genau den Zugriff, den du diesem Zugang gegeben hast. Füge ihn nie in einen Chat ein. Warum ein Schlüssel und kein Anmeldefenster? Grok verbindet sich mit einem Zugriffs-Schlüssel. Claude und ChatGPT nutzen die Anmeldung per Browser-Fenster (OAuth). Für dich ändert das nichts an den Rechten: Du bestimmst weiterhin je Kalender, was sichtbar ist und ob Termine angelegt werden dürfen. ## 2. Kalender Sync in Grok Build eintragen [Abschnitt betitelt „2. Kalender Sync in Grok Build eintragen“](#2-kalender-sync-in-grok-build-eintragen) 1. Führe diesen Befehl aus und ersetze `ksa_…` durch deinen Schlüssel: ```bash grok mcp add --transport http kalender-sync https://app.kalender-sync.de/mcp \ --header "Authorization: Bearer ksa_…" ``` 2. Prüfe die Verbindung mit `grok mcp list` oder `grok mcp doctor kalender-sync`. Danach kannst du loslegen, z. B.: *„Welche Kalender sind über Kalender Sync freigegeben?”*, *„Wo habe ich diese Woche zwei Stunden am Stück?”* oder *„Wann ist mein Zahnarzt-Termin?”* ## Wenn etwas nicht klappt [Abschnitt betitelt „Wenn etwas nicht klappt“](#wenn-etwas-nicht-klappt) * **401 / „Unauthorized“:** Schlüssel falsch, abgelaufen oder widerrufen. Server mit `grok mcp remove kalender-sync` entfernen und mit einem neuen Schlüssel erneut hinzufügen. * **Ein Kalender fehlt:** Ergänze ihn in der App unter **KI-Assistent → Freigabe bearbeiten** — das wirkt sofort. Hast du ihn erst nach dem Verbinden angelegt: [Neu angelegte Kalender](/ki-assistent/#neu-angelegte-kalender). ## Zugang widerrufen [Abschnitt betitelt „Zugang widerrufen“](#zugang-widerrufen) In Kalender Sync unter **KI-Assistent** beim Zugang auf **Widerrufen** — sofort wirksam, der Schlüssel ist damit ungültig, egal was in Grok gespeichert ist. Mehr dazu unter [Zugang widerrufen](/ki-assistent/#zugang-widerrufen). # Mit n8n verbinden > Kalender Sync als MCP-Server in n8n einbinden — AI-Agent-Workflows mit Kalenderzugriff über alle Anbieter. Schritt-für-Schritt-Anleitung, Prompt-Vorlage und Workflow-Ideen. Mit n8n baust du Workflows, in denen ein KI-Agent deine Kalender lesen und (in jedem Tarif) Termine anlegen kann — über **alle verbundenen Anbieter gleichzeitig**: Google, Outlook, iCloud, GMX, WEB.DE und mehr. Das kann kein einzelner Google-Calendar- oder Outlook-Node. Die Adresse (MCP-Server-URL), die du unten einträgst, ist: ```plaintext https://app.kalender-sync.de/mcp ``` Voraussetzungen * Ein Kalender-Sync-Konto mit [verbundenen Kalendern](/getting-started/connect-first-calendar/) — Lesen und [Termine anlegen](/ki-assistent/schreibzugriff/) gehen in jedem Tarif. * **n8n ab Version 2.19.0** (Cloud oder self-hosted). Ältere Versionen verwerfen strukturierte Tool-Ergebnisse — der Agent behauptet dann fälschlich, deine Kalenderliste sei leer. Die Version findest du in n8n unter **Help → About**. * Ein **Zugriffs-Schlüssel** aus der App (Schritt 1). ## 1. Zugriff und Schlüssel in Kalender Sync erstellen [Abschnitt betitelt „1. Zugriff und Schlüssel in Kalender Sync erstellen“](#1-zugriff-und-schlüssel-in-kalender-sync-erstellen) Öffne in der App **KI-Assistent → Assistent verbinden** und wähle **n8n**. Wie bei jedem Zugang wählst du die Kalender einzeln aus und stellst je Kalender die [Detailtiefe](/ki-assistent/sichtbarkeit/) ein — nicht freigegebene Kalender existieren für n8n nicht. Mit **Schlüssel erstellen** bekommst du deinen Zugriffs-Schlüssel (ein Token, beginnt mit `ksa_`). Er wird **nur einmal angezeigt** — kopiere ihn direkt in die n8n-Credentials (Schritt 2). Behandle ihn wie ein Passwort: Wer den Schlüssel hat, hat genau den Zugriff, den du diesem Zugang gegeben hast. ## 2. Workflow bauen [Abschnitt betitelt „2. Workflow bauen“](#2-workflow-bauen) ### Der schnelle Weg: mit dem n8n-KI-Builder [Abschnitt betitelt „Der schnelle Weg: mit dem n8n-KI-Builder“](#der-schnelle-weg-mit-dem-n8n-ki-builder) n8n kann den Workflow aus einer Beschreibung generieren. Diese Vorlage funktioniert (Builder-Prompts klappen auf Englisch am zuverlässigsten): ```text Build a workflow with a Chat Trigger connected to an AI Agent. The AI Agent should use an MCP Client Tool node with these settings: - Endpoint URL: https://app.kalender-sync.de/mcp - Server Transport: HTTP Streamable - Authentication: Header Auth (I will fill in the credential myself) - Include all available tools Set the AI Agent's system message to: "You are a calendar assistant with access to the user's calendars via Kalender Sync MCP tools. Use list_calendars first to see which calendars are available and their visibility levels. When asked about availability, use get_availability. Always mention any warnings the tools return, and say what your answer does NOT cover." Use gpt-4.1-mini as the chat model. ``` Der Builder kann keine Credentials anlegen — den Token trägst du danach von Hand ein (nächster Abschnitt, Punkt 3). ### Der manuelle Weg: vier Nodes [Abschnitt betitelt „Der manuelle Weg: vier Nodes“](#der-manuelle-weg-vier-nodes) 1. **Chat Trigger** hinzufügen (oder ein anderer Trigger, siehe Workflow-Ideen unten). 2. **AI Agent**-Node dahinter. Als **Chat Model** empfehlen wir **gpt-4.1-mini** oder ein vergleichbares Nicht-Reasoning-Modell (warum, steht unter Problemlösung). 3. Am Agent unter **Tool** den Node **MCP Client Tool** anhängen: * **Endpoint URL:** `https://app.kalender-sync.de/mcp` * **Server Transport:** `HTTP Streamable` * **Authentication:** `Header Auth` → neues Credential anlegen: * **Name:** `Authorization` * **Value:** `Bearer ksa_…` (dein Token aus Schritt 1 — das Wort `Bearer`, ein Leerzeichen, dann der Token) * **Tools to include:** `All` 4. Dem Agent eine **System Message** geben — die Vorlage aus dem Builder-Prompt oben passt wörtlich. Wenn alles verbunden ist, zeigt der MCP-Client-Node die verfügbaren Tools an — `list_calendars`, `get_availability`, `search_events` und (bei freigeschaltetem Schreibzugriff) `create_event`, `update_event`, `delete_event`. Die technischen Details zu jedem Tool: [Tool-Referenz](/ki-assistent/tool-referenz/). ## 3. Testen [Abschnitt betitelt „3. Testen“](#3-testen) Öffne den Chat und frag: * *„Welche Kalender siehst du und mit welcher Sichtbarkeit?”* — der Agent sollte genau die Kalender nennen, die du in Schritt 1 freigegeben hast, samt Detailtiefe. * *„Bin ich nächsten Dienstag zwischen 9 und 12 Uhr frei?”* — Verfügbarkeit über alle freigegebenen Kalender hinweg. * *„Lege morgen 10 Uhr ‚Testtermin per n8n’ in \[Kalendername] an”* (Kalender mit Schreibzugriff) — und danach: *„Lösch ihn wieder.”* Jeder Aufruf landet im [Zugriffsprotokoll](/ki-assistent/#was-in-deiner-hand-bleibt) auf der Seite **KI-Assistent** — dort siehst du live, welches Tool wann aufgerufen wurde. ## Workflow-Ideen [Abschnitt betitelt „Workflow-Ideen“](#workflow-ideen) **Verfügbarkeits-Bot für Slack oder Telegram.** Slack-/Telegram-Trigger → AI Agent mit Kalender-Sync-Tools → Antwort in den Channel. Kolleg:innen (oder du selbst vom Handy) fragen in natürlicher Sprache nach freien Slots — der Agent prüft Google, Outlook und GMX in einem Aufruf. **Termin aus Formular.** n8n-Form- oder Webhook-Trigger (z. B. Buchungsanfrage von der Website) → AI Agent extrahiert Datum, Uhrzeit und Anliegen → `create_event` in deinem Arbeitskalender. Der Agent verwaltet nur Termine, die er selbst angelegt hat — deine bestehenden Termine kann er [nicht anfassen](/ki-assistent/schreibzugriff/). **Morgen-Briefing.** Schedule-Trigger (werktags 7 Uhr) → AI Agent fasst mit `search_events` und `get_availability` den Tag zusammen → per E-Mail oder Slack: „Heute 4 Termine, größte Lücke 13–15 Uhr.” **Konflikt-Wächter.** Schedule-Trigger stündlich → Agent prüft `get_availability` auf Doppelbuchungen zwischen Job- und Privatkalender → Nachricht nur, wenn sich etwas überschneidet. ## Problemlösung [Abschnitt betitelt „Problemlösung“](#problemlösung) „Ich sehe keine Kalender” — obwohl die Tool-Aufrufe grün sind Das ist in fast allen Fällen eine von zwei n8n-Stolperfallen, nicht dein Zugang: 1. **n8n älter als 2.19.0:** Der MCP-Client verwirft dort strukturierte Tool-Ergebnisse, der Agent bekommt eine leere Antwort und ruft das Tool in Schleife auf ([n8n-Issue #26963](https://github.com/n8n-io/n8n/issues/26963)). → n8n aktualisieren. 2. **Reasoning-Modell + Streaming** (z. B. gpt-5-mini mit aktiviertem Streaming im Chat Trigger): Tool-Ergebnisse kommen leer beim Modell an. → Modell auf **gpt-4.1-mini** o. ä. wechseln oder im Chat Trigger den Response Mode von „Streaming” auf „When Last Node Finishes” stellen. Ob dein Zugang selbst funktioniert, siehst du unabhängig davon im **Zugriffsprotokoll** in der App: Stehen dort erfolgreiche `list_calendars`-Aufrufe, liegt es am Workflow, nicht am Zugang. * **401 / „Unauthorized”:** Token falsch kopiert, abgelaufen oder [widerrufen](/ki-assistent/#zugang-widerrufen). Prüfe das Credential: Header-Name exakt `Authorization`, Wert exakt `Bearer ksa_…` (mit Leerzeichen). Zur Not in der App einen neuen Token erstellen. * **Nur SSE als Transport verfügbar:** Dein n8n ist älter als 1.112. Wir unterstützen ausschließlich **HTTP Streamable** — bitte aktualisieren. * **Ein Kalender fehlt in der Liste:** Er ist für diesen Zugang nicht freigegeben — in der App unter **KI-Assistent → Freigabe bearbeiten** ergänzen. Änderungen wirken sofort, ohne neuen Token. Hast du ihn erst nach dem Verbinden angelegt: [Neu angelegte Kalender](/ki-assistent/#neu-angelegte-kalender). * **`create_event` schlägt fehl:** Schreibzugriff gibt es [in jedem Tarif](/ki-assistent/schreibzugriff/) und muss pro Kalender freigeschaltet sein. ## Sicherheit & Kontrolle [Abschnitt betitelt „Sicherheit & Kontrolle“](#sicherheit--kontrolle) Für n8n gilt dasselbe wie für jeden Assistenten-Zugang: Du bestimmst [pro Kalender, was sichtbar ist](/ki-assistent/sichtbarkeit/), jede Abfrage wird protokolliert (nie der Termininhalt), und der [Widerruf in Kalender Sync](/ki-assistent/#zugang-widerrufen) macht den Token sofort ungültig — egal, was in n8n gespeichert ist. Lege den Token ausschließlich in n8n-**Credentials** ab, nie direkt in Node-Parametern oder Ausdrücken, damit er nicht in Ausführungs-Logs auftaucht. # Mit OpenClaw verbinden > Kalender Sync in OpenClaw einrichten — als MCP-Server mit Zugriffs-Schlüssel, optional mit dem Kalender-Sync-Skill. In **OpenClaw** bindest du Kalender Sync als Remote-MCP-Server ein. Optional legst du zusätzlich unseren Skill ab, damit der Agent weiß, wie er mit deinen Kalendern umgehen soll. ## 1. Zugang und Schlüssel in Kalender Sync erstellen [Abschnitt betitelt „1. Zugang und Schlüssel in Kalender Sync erstellen“](#1-zugang-und-schlüssel-in-kalender-sync-erstellen) Noch kein Konto? Lege es unter [app.kalender-sync.de](https://app.kalender-sync.de/) an (7 Tage Professional gratis, keine Kreditkarte) und [verbinde deine Kalender](/getting-started/connect-first-calendar/). Öffne in der App **KI-Assistent → Assistent verbinden** und wähle **OpenClaw**. Wie bei jedem Zugang wählst du die Kalender einzeln aus und stellst je Kalender die [Detailtiefe](/ki-assistent/sichtbarkeit/) ein — nicht freigegebene Kalender existieren für OpenClaw nicht. Mit **Schlüssel erstellen** bekommst du deinen Zugriffs-Schlüssel (ein Token, beginnt mit `ksa_`). Er wird **nur einmal angezeigt**. Behandle ihn wie ein Passwort: Wer den Schlüssel hat, hat genau den Zugriff, den du diesem Zugang gegeben hast. Füge ihn nie in einen Chat ein. Warum ein Schlüssel und kein Anmeldefenster? OpenClaw verbindet sich mit einem Zugriffs-Schlüssel. Claude und ChatGPT nutzen die Anmeldung per Browser-Fenster (OAuth). Für dich ändert das nichts an den Rechten: Du bestimmst weiterhin je Kalender, was sichtbar ist und ob Termine angelegt werden dürfen. Der Zugang wird als OpenClaw-Verbindung gespeichert. Verwende seinen Schlüssel ausschließlich in OpenClaw; für andere Assistenten legst du einen eigenen Zugang an. Bereits bestehende Zugänge unter „Etwas anderes“ werden nicht automatisch umbenannt oder OpenClaw zugeordnet. ## 2. Kalender Sync in OpenClaw eintragen [Abschnitt betitelt „2. Kalender Sync in OpenClaw eintragen“](#2-kalender-sync-in-openclaw-eintragen) Lege den Schlüssel als Umgebungsvariable `KALENDER_SYNC_KEY` ab und trage den Server ein. Die einfachen Anführungszeichen sorgen dafür, dass OpenClaw `${KALENDER_SYNC_KEY}` selbst auflöst und der Schlüssel nicht in der Konfiguration landet: ```bash export KALENDER_SYNC_KEY="ksa_…" openclaw mcp set kalender-sync '{"url":"https://app.kalender-sync.de/mcp","transport":"streamable-http","headers":{"Authorization":"Bearer ${KALENDER_SYNC_KEY}"}}' ``` Am besten setzt du `KALENDER_SYNC_KEY` dauerhaft in deinem Shell-Profil statt nur in der aktuellen Sitzung. ## 3. Optional: den Skill installieren [Abschnitt betitelt „3. Optional: den Skill installieren“](#3-optional-den-skill-installieren) Der Skill erklärt dem Agenten, wie er Kalender Sync nutzt (erst `list_calendars`, Warnungen weitergeben, nur in beschreibbare Kalender schreiben). Im OpenClaw-Workspace ausführen: ```bash mkdir -p skills/kalender-sync curl --fail --silent --show-error \ 'https://kalender-sync.de/skills/kalender-sync/SKILL.md' \ --output skills/kalender-sync/SKILL.md ``` Danach OpenClaw bitten, den Skill **kalender-sync** zu verwenden. Danach kannst du loslegen, z. B.: *„Welche Kalender sind über Kalender Sync freigegeben?”*, *„Wo habe ich diese Woche zwei Stunden am Stück?”* oder *„Wann ist mein Zahnarzt-Termin?”* ## Zugang widerrufen [Abschnitt betitelt „Zugang widerrufen“](#zugang-widerrufen) In Kalender Sync unter **KI-Assistent** beim Zugang auf **Widerrufen** — sofort wirksam, der Schlüssel ist damit ungültig, egal was in OpenClaw gespeichert ist. Mehr dazu unter [Zugang widerrufen](/ki-assistent/#zugang-widerrufen). # Schreibzugriff (Termine anlegen) > Auf jedem Tarif darf der KI-Assistent auf deine Bitte hin Termine anlegen — und mit der zweiten Freigabe auch bestehende ändern, löschen und Einladungen beantworten. Auf **jedem Tarif** kannst du dem Assistenten pro Kalender erlauben, **Termine anzulegen**. Beim Verbinden eines Assistenten und unter **KI-Assistent → Freigabe bearbeiten** öffnest du die Einstellungen über **das Regler-Symbol neben der Zugriffsangabe** am ausgewählten Kalender. Dort stehen Detailtiefe und beide Schreibrechte. Neue Freigaben starten mit den maximal verfügbaren Rechten; du kannst sie vor dem Bestätigen einschränken. Bestehende Freigaben werden beim erneuten Verbinden nicht erweitert. Darunter sitzt ein **zweiter Schalter: „Darf bestehende Termine ändern und löschen”**. Er ist bewusst getrennt, weil er eine größere Befugnis ist: Einen Termin anzulegen fügt etwas hinzu, einen bestehenden umzuschreiben verändert, was schon da ist. ## Was der Assistent darf [Abschnitt betitelt „Was der Assistent darf“](#was-der-assistent-darf) **Mit dem ersten Schalter:** * **Termine anlegen** — „Leg mir Dienstag 10–11 Uhr einen Termin mit XY rein.” * **Seine eigenen Termine ändern oder löschen** — die, die er selbst angelegt hat. **Mit dem zweiten Schalter zusätzlich:** * **Bestehende Termine ändern und löschen** — „Verschieb den Zahnarzt auf 14 Uhr.” Geändert wird nur, was du sagst: Erinnerungen, Teilnehmer und Wiederholungen bleiben. Hat der Termin Teilnehmer, werden sie benachrichtigt — bei jedem Anbieter. * **Einladungen beantworten** — zusagen, absagen, vorläufig zusagen. Der Organisator wird benachrichtigt; eine Einladung nur zu löschen würde ihn weiter mit dir rechnen lassen. ## Wo der zweite Schalter nicht greift [Abschnitt betitelt „Wo der zweite Schalter nicht greift“](#wo-der-zweite-schalter-nicht-greift) Er lässt sich nur dort aktivieren, wo er auch funktionieren kann: * **Nur bei „Alle Details”.** Sieht der Assistent nur „Geblockt” oder Titel und Zeit, könnte er dir nicht einmal sagen, welchen Termin er ändert. Blind handeln ist schlechter als ablehnen. * **Nicht bei iCal-Feeds.** Ein abonnierter Feed ist nur lesbar. Google, Microsoft und alle CalDAV-Anbieter (iCloud, GMX, WEB.DE, mailbox.org, Posteo, STRATO, Disroot, KSuite) gehen. * **Einladungen bei CalDAV-Anbietern nur, wo der Server die Antwort zustellt.** Bei CalDAV schickt der Server selbst die Antwort an den Organisator. Bei iCloud gilt das nur für Einladungen von anderen iCloud-Nutzern. Wo der Server es nicht kann, verweist der Assistent auf deine Kalender-App, statt eine Antwort zu schicken, die niemand bekommt. Eine Notiz zur Antwort kommt bei CalDAV nicht mit — der Assistent sagt dir das dann. * **Nur bei Terminen, die du selbst organisiert hast.** Eine fremde Einladung kann der Assistent nicht umschreiben. Er kann sie für dich absagen, und das erreicht den Organisator. * **Nicht bei synchronisierten Kopien.** Änderst du eine Kopie, überschreibt der nächste Sync sie wieder. Der Assistent lehnt deshalb ab und nennt dir den Quellkalender, in dem die Änderung Bestand hat. ## Dritter Schalter: Syncs [Abschnitt betitelt „Dritter Schalter: Syncs“](#dritter-schalter-syncs) Seit Server-Version 1.6.0 gibt es pro Kalender einen **dritten Schalter: „Syncs in diesen Kalender verwalten”**. Er setzt „Termine anlegen” voraus und ist getrennt, weil ein Sync dauerhaft in den Kalender schreibt und auch nach einem Widerruf weiterläuft. Bei neuen Freigaben ist er vorausgewählt. Details unter [Syncs per Assistent](/ki-assistent/syncs/). ## Die Sicherheitsgrenzen [Abschnitt betitelt „Die Sicherheitsgrenzen“](#die-sicherheitsgrenzen) * **Nur freigegebene, beschreibbare Kalender.** Schreiben lässt sich nur für einen Kalender aktivieren, den du ohnehin zum Lesen freigegeben hast. Rein lesbare Kalender (z. B. abonnierte Feeds) tauchen als Schreibziel gar nicht auf. * **Wiederkehrende Einladungen fragen nach.** Bei einer Serie fragt der Assistent, ob nur dieser eine Termin oder die ganze Reihe gemeint ist — außer du hast ein Datum genannt. Eine Absage an den Organisator lässt sich nicht zurücknehmen. * **Bestätigung passiert im Client.** Claude Code fragt bei jedem Schreibvorgang nach, bevor er ausgeführt wird. Wer den Auto-Modus einschaltet, entscheidet sich bewusst dafür. * **Doppelbuchung wird gemeldet, nicht verhindert.** Überschneidet sich ein neuer Termin mit einem bestehenden, wird er trotzdem angelegt — aber die Überschneidung kommt als Warnung zurück. Ob eine Doppelbelegung gewollt ist, entscheidest du, nicht wir. * **Zeitzone ist Pflicht.** Der Assistent muss bei jedem Termin eine Zeitzone mitgeben, damit er nie zur falschen Uhrzeit landet. ## Protokoll [Abschnitt betitelt „Protokoll“](#protokoll) Jeder Schreibvorgang steht im Zugriffsprotokoll — mit Kalender, Ergebnis und Dauer, aber **ohne den Titel** des Termins. Die Nullaufbewahrung gilt auch hier. ## Schreibzugriff nachträglich aktivieren [Abschnitt betitelt „Schreibzugriff nachträglich aktivieren“](#schreibzugriff-nachträglich-aktivieren) Schaltest du den Schreibzugriff erst frei, nachdem der Assistent bereits verbunden war, kennt er die neuen Schreib-Tools noch nicht — er hat die Tool-Liste beim Verbinden geladen. Er wird dir dann weiter sagen, dass er keine Termine anlegen kann. Nach dem Speichern in der App also einmal die Tool-Liste im Client neu laden: * **Claude:** beim Konnektor auf das Drei-Punkte-Menü und **Aktualisieren** (im englischen Interface: *Refresh*). * **Andere Clients:** die Verbindung neu laden oder kurz trennen und wieder verbinden. Ein neuer Token ist nicht nötig. Den Schreibzugriff kannst du pro Kalender jederzeit wieder abschalten oder den Zugang ganz [widerrufen](/ki-assistent/#zugang-widerrufen). # Was der Assistent sieht > Pro Kalender legst du fest, wie viel der KI-Assistent sehen darf — nur ob du geblockt bist, Titel und Zeit, oder alle Details. Nicht freigegebene Kalender bleiben unsichtbar. Für jeden Kalender, den du freigibst, wählst du **eine von drei Detailstufen**. Nicht freigegebene Kalender existieren für den Assistenten nicht — sie tauchen in keiner Antwort auf. Bei einer **neuen Assistenten-Verbindung** ist pro Konto nur der vom Anbieter gekennzeichnete **Hauptkalender** vorausgewählt, soweit die Tarifgrenze reicht. Weitere Kalender kannst du anhaken. Ohne gekennzeichneten Hauptkalender wählst du selbst. Ausgewählte Kalender starten mit den maximal verfügbaren Rechten; **das Regler-Symbol neben der Zugriffsangabe** öffnet je Kalender die Detailtiefe sowie Schreib- und Verwaltungsrechte. Mit **Freigeben** bestätigst du die Auswahl. Falls ein Tarifangebot erscheint, kannst du es direkt überspringen. Danach wird der Zugriff erteilt; die Abschlussseite zeigt Beispiel-Prompts und einen App-Link. Sie leitet nach acht Sekunden zum Assistenten zurück, oder sofort über den Zurück-Button. Bestehende Freigaben behalten beim erneuten Verbinden ihre bisherigen Rechte, soweit sie weiterhin verfügbar sind. ## Die drei Stufen [Abschnitt betitelt „Die drei Stufen“](#die-drei-stufen) | Stufe | Der Assistent sieht … | | ------------------ | ------------------------------------------------------------------ | | **Nur „Geblockt”** | dass ein Zeitraum belegt ist — sonst nichts. Kein Titel, kein Ort. | | **Titel und Zeit** | zusätzlich den Titel des Termins und die Uhrzeit. | | **Alle Details** | zusätzlich Beschreibung und Ort. | Im Zweifel wählst du **„Nur Geblockt”** — das reicht für Verfügbarkeits­fragen („bin ich frei?”) vollkommen aus und gibt am wenigsten preis. Beachte: Die Termin-Suche kann solche Kalender nicht durchsuchen — ohne Titel gibt es nichts zu finden. Der Assistent sagt das dann dazu, statt „kein Treffer” zu behaupten. ## Wie das Lesen funktioniert [Abschnitt betitelt „Wie das Lesen funktioniert“](#wie-das-lesen-funktioniert) * Der Assistent liest die Kalender **direkt beim Anbieter** (Google, Outlook, iCloud, GMX, …), nicht aus einer Kopie bei uns. Jede Antwort sagt dazu, wann der Kalender gelesen wurde. * **Abgesagte Termine** werden nie geliefert. Alles andere schon — jeder Eintrag trägt aber die Angabe, ob er die Zeit wirklich **belegt**. „Tentativ” markierte Termine belegen sie, Feiertage und Geburtstage nicht. Ganztägige Termine hängen vom Anbieter ab: **Apple/iCloud markiert sie immer als „frei”**, ohne dass sich daran etwas einstellen ließe — sie gelten darum als nicht belegend, sind aber trotzdem echte Termine. Bei „Bin ich frei?” zählt der Assistent nur das wirklich Belegende, bei „Was habe ich an dem Tag?” nennt er alles. * Konnte ein freigegebener Kalender gerade nicht gelesen werden, sagt die Antwort das ausdrücklich — statt so zu tun, als wärst du frei. ## Was nie übertragen wird [Abschnitt betitelt „Was nie übertragen wird“](#was-nie-übertragen-wird) Teilnehmer, Anhänge und Links deiner Termine werden **nie** an den Assistenten weitergegeben — auch nicht auf der Stufe „Alle Details”. Und das Zugriffsprotokoll hält nur fest, *dass* und *was* abgefragt wurde, **nie den Inhalt** deiner Termine. Die Detailtiefe kannst du jederzeit ändern oder den Zugang ganz [widerrufen](/ki-assistent/#zugang-widerrufen). # Syncs per Assistent > Der KI-Assistent kann deine Syncs auflisten, erklären, warum einer steht, neue Syncs zwischen deinen eigenen Kalendern einrichten (in eine oder beide Richtungen), Syncs pausieren und nach Bestätigung löschen. Seit Server-Version 1.6.0 kann dein KI-Assistent auch mit deinen **Syncs** arbeiten. Die Sync-Tools kosten **keine Credits**. ## Was der Assistent kann [Abschnitt betitelt „Was der Assistent kann“](#was-der-assistent-kann) * **Syncs auflisten:** „Welche Syncs habe ich?” Der Assistent sieht, welcher Kalender in welchen kopiert, ob der Sync läuft und, falls nicht, warum. * **Erklären, warum ein Sync steht:** „Warum kommen meine Arbeitstermine nicht mehr an?” Die Antwort nennt einen dokumentierten Grund (z. B. Konto muss neu verbunden werden) und den nächsten Schritt mit Link in die App. * **Einen neuen Sync einrichten:** „Spiegel meinen Arbeitskalender als ‚Geblockt’ in meinen privaten Kalender.” Der Assistent prüft vorher, ob das geht, und legt den Sync erst an, wenn du Quelle, Ziel und Detailstufe im Chat bestätigt hast. * **In beide Richtungen:** „Halte Arbeit und Privat gegenseitig auf dem Stand, nur als ‚Geblockt’.” Ein Zwei-Wege-Sync ist ein Sync; jede Richtung hat ihre eigene Detailstufe. * **Pausieren und fortsetzen:** „Pausier den Sync.” Fortsetzen geht genauso, eine automatische Wiederaufnahme zu einem Zeitpunkt gibt es nicht. Pausieren löscht nichts. Die Kopien bleiben im Zielkalender, es wird nur nicht weiter abgeglichen. * **Löschen, mit Bestätigung:** „Lösch den Sync von Arbeit nach Privat.” Der Assistent nennt dir zuerst, welcher Sync es ist und wie viele Kopien entfernt werden, und löscht erst, wenn du zustimmst. Die Originaltermine bleiben unberührt; die Kopien im Zielkalender verschwinden. Das lässt sich nicht rückgängig machen. ## Was bewusst in der App bleibt [Abschnitt betitelt „Was bewusst in der App bleibt“](#was-bewusst-in-der-app-bleibt) * **Regeln ändern** (Detailstufe, Titel, Ganztags-Verhalten, Farbnamen für [Terminfarben](/sync/event-colors/)) und die **Richtung umkehren**. Ob Terminfarben übernommen werden, kann der Assistent beim Anlegen mitgeben. * **Syncs mit anderen Personen** (Einladungen). * **Neue Zielkalender anlegen** lassen. Der Assistent verlinkt dafür direkt auf die passende Seite in der App. ## Die Sicherheitsgrenzen [Abschnitt betitelt „Die Sicherheitsgrenzen“](#die-sicherheitsgrenzen) * **Nur deine freigegebenen Kalender.** Die Quelle muss für den Assistenten freigegeben sein. Das Ziel braucht einen eigenen Haken: **„Syncs in diesen Kalender verwalten”** im Kalender-Dialog (Regler-Symbol beim Verbinden oder unter KI-Assistent → Freigabe bearbeiten). Er setzt „Termine anlegen” voraus und ist bei jedem neu angehakten Kalender vorausgewählt. Sonst könnte ein Sync einen gesperrten Kalender in einen freigegebenen kopieren, und der Assistent könnte ihn danach doch lesen. * **Nie mehr Details, als der Assistent sehen darf.** Siehst du für den Assistenten bei der Quelle nur „Geblockt”, kann er auch nur einen Sync mit „Geblockt” anlegen. * **Keine Kreise.** Einen Sync, der über andere Syncs wieder bei der Quelle ankäme, oder eine zweite Richtung neben einem bestehenden Ein-Weg-Sync legt der Assistent nicht an. Für beide Richtungen nimmt er einen Zwei-Wege-Sync. * **Zwei-Wege nur mit beiden Haken.** Bei einem Zwei-Wege-Sync ist jeder Kalender auch Ziel; beide müssen freigegeben sein und den Sync-Haken haben. * **Löschen nur nach deiner Bestätigung.** Die Bestätigung gilt 10 Minuten und nur für genau den Sync, den der Assistent dir gezeigt hat. Ohne sie wird nichts gelöscht. * **Dein Tarif gilt auch hier.** Syncs zwischen deinen eigenen Kalendern gibt es ab Basic; die Anzahl richtet sich nach deinem Tarif. * **Pausieren nur bei freigegebenen Zielen.** Er kann nur Syncs pausieren oder fortsetzen, deren Zielkalender den Sync-Haken hat. Wurde ein Sync wegen des Tarifs oder eines fehlenden Kalenders angehalten, setzt ihn der Assistent nicht fort. * **Ein Sync läuft weiter.** Ein angelegter Sync ist ein normaler Sync in deinem Konto. Er läuft auch dann weiter, wenn du den Zugang des Assistenten später widerrufst. Beenden kannst du ihn jederzeit in der App. ## Die Sync-Tools fehlen? [Abschnitt betitelt „Die Sync-Tools fehlen?“](#die-sync-tools-fehlen) Bestehende Verbindungen kennen die neuen Tools erst, wenn der Client die Tool-Liste neu lädt: * **Claude:** beim Konnektor auf das Drei-Punkte-Menü und **Aktualisieren** (im englischen Interface: *Refresh*). * **Andere Clients:** die Verbindung neu laden oder kurz trennen und wieder verbinden. Ein neuer Token ist nicht nötig. Einen Sync **anlegen** und **pausieren** kann der Assistent nur, wenn mindestens ein Kalender den Sync-Haken hat. Setzt du ihn nachträglich, lade die Tool-Liste neu (siehe oben). ## Protokoll [Abschnitt betitelt „Protokoll“](#protokoll) Jeder Aufruf steht im Zugriffsprotokoll: welches Tool, welche Kalender, Ergebnis. Syncs, die der Assistent angelegt hat, sind intern als solche markiert. Technische Details zu allen Parametern stehen in der [Tool-Referenz](/ki-assistent/tool-referenz/#sync-tools). # Für Entwickler: Tool-Referenz > Alle MCP-Tools des Kalender-Sync-Servers im Detail — Parameter, Verhalten, Sichtbarkeits-Gating, Schreibrechte und Sync-Tools. Stand v1.9.1. Der Kalender-Sync-MCP-Server (`https://app.kalender-sync.de/mcp`, Streamable HTTP) stellt bis zu **fünfzehn Tools** bereit. Die Tool-Beschreibungen sind Englisch — sie sind primär für das Sprachmodell geschrieben; dein Assistent antwortet dir trotzdem in deiner Sprache. Zwei Eigenschaften gelten für alle Tools: * **Sichtbarkeits-Gating:** Jedes Tool sieht nur die Kalender, die du freigegeben hast, und je Kalender nur die erlaubte [Detailstufe](/ki-assistent/sichtbarkeit/). Nicht freigegebene Kalender existieren für den Server nicht. * **Dynamische Tool-Liste:** Die vier Schreib-Tools erscheinen nur, wenn dein Zugriff schreiben darf; `create_sync`, `set_sync_paused`, `preview_delete_sync` und `delete_sync` nur, wenn mindestens ein Kalender für Syncs freigegeben ist ([in jedem Tarif, pro Kalender freigegeben](/ki-assistent/schreibzugriff/)). Ein Zugriff ohne Schreibrecht sieht 7 Tools (4 Lese-Tools und 3 lesende Sync-Tools) — ein Tool, das immer ablehnen würde, gibt es bei uns nicht. Änderst du die Schreibrechte später, erscheinen die Tools erst, wenn der Client die Tool-Liste [neu lädt](/ki-assistent/schreibzugriff/#schreibzugriff-nachtr%C3%A4glich-aktivieren). ## Credits und Ergebnisstatus [Abschnitt betitelt „Credits und Ergebnisstatus“](#credits-und-ergebnisstatus) `list_calendars`, `send_feedback` und alle [Sync-Tools](#sync-tools) kosten **0 Credits** und funktionieren auch bei leerem Guthaben. `search_events` kostet 1 Credit; `get_availability` und jeder Termin-Schreibaufruf (anlegen, ändern, löschen, beantworten) kosten 2 Credits. Nur erfolgreich ausgeführte, kostenpflichtige Aufrufe werden berechnet. Die sechs kostenpflichtigen Tools liefern bei einem ausgeführten Aufruf `status: "ok"` neben ihren Ergebnisfeldern. Fehlen Credits für den Aufruf, liefern sie stattdessen `status: "credits_exhausted"`, `warnings`, `credits_available`, `credits_required` und `resets_at` (ISO-Zeitpunkt oder `null`). Das ist ein reguläres Tool-Ergebnis ohne `isError`, aber **keine ausgeführte Kalenderaktion**: Es fehlen `busy`, `matches`, `event_id` und alle Schreibbestätigungen. Echte Fehler bleiben Fehler. Prüfe deshalb zuerst `status`. Eine Creditsperre bedeutet weder „keine Termine“ noch „Termin angelegt/geändert/gelöscht“. Zeige den Hinweis an und wiederhole den Aufruf nicht automatisch. Nach einem bestätigten Upgrade oder Nachkauf ist ein erneuter Versuch sinnvoll. Im Free-Tarif führt der Weg über ein Upgrade; ab Basic sind zusätzliche Credits nachkaufbar. Die Sperre bleibt im Zugriffsprotokoll als `denied_credits` sichtbar. Clients mit gespeicherten Tool-Schemas müssen die Tool-Liste für Version 1.6.0 neu laden, etwa durch eine neue Verbindung; erst dann erscheinen auch die Sync-Tools. Die Ergebnisfelder sind im Schema optional, weil sie bei einer Creditsperre fehlen; bei `status: "ok"` gelten weiterhin die jeweiligen Ergebnisfelder des Tools. ## Lese-Tools [Abschnitt betitelt „Lese-Tools“](#lese-tools) ### `list_calendars` [Abschnitt betitelt „list\_calendars“](#list_calendars) Listet die freigegebenen Kalender mit ihrer jeweiligen Detailstufe. `readable: false` markiert Kalender, die gerade nicht gelesen werden können (sie fehlen dann auch in allen anderen Antworten — und werden bewusst aufgeführt statt verschwiegen). `writable: true` markiert die Kalender, in die dieser Zugriff Termine schreiben darf — das ist die Quelle für die `calendar_id` von `create_event`. `sync_health` zeigt zusätzlich den Zustand der Kalender-Sync-eigenen Synchronisation, falls der Kalender an einer teilnimmt. `notice` erklärt gegebenenfalls eine Einschränkung des Schreibzugriffs und wie sie sich beheben lässt. Der Hinweis ist relevant, wenn die gewünschte Aktion diesen Zugriff benötigt. `missing_calendars` (seit 1.8.0, immer vorhanden) sagt, was zu tun ist, wenn ein erwarteter Kalender fehlt. Gibt es [nach dem Verbinden angelegte Kalender](/ki-assistent/#neu-angelegte-kalender), die dieser Zugriff noch nicht sieht, nennt das Feld ihre Anzahl, nie ihre Namen, und den Weg zur Freigabe. *Parameter: keine.* ### `get_availability` [Abschnitt betitelt „get\_availability“](#get_availability) Liefert die Termine in einem Zeitraum, über alle freigegebenen Kalender hinweg. Jeder Kalender wird **direkt beim Anbieter** gelesen (keine Kopie); Lesevorgänge werden bis zu 60 Sekunden wiederverwendet. Nachdem dieser Assistent erfolgreich einen Termin angelegt, geändert oder gelöscht oder auf eine Einladung geantwortet hat, wird der betroffene Kalender bei der nächsten Abfrage neu gelesen. Enthalten ist alles außer abgesagten Terminen — auch Ganztägiges und „mit Vorbehalt”. Konnte ein Kalender nicht gelesen werden, steht das in `sources` und `warnings` — eine Antwort behauptet nie Vollständigkeit, die sie nicht hat. Je Eintrag sagt `blocks_time`, ob er die Zeit tatsächlich belegt. `false` steht bei Einträgen, die dich nicht unverfügbar machen: Feiertage, Geburtstage und **alle ganztägigen Termine aus Apple/iCloud**, die dieser Anbieter grundsätzlich als „frei” markiert, ohne dass sich daran etwas einstellen ließe. Ein solcher Eintrag ist trotzdem ein echter Termin — ein ganztägiges „Baustelle Darmstadt” ist ein Arbeitstag, keine freie Zeit. Für „Bin ich frei?” zählt darum nur `blocks_time: true`, für „Was habe ich an dem Tag?” zählt alles. | Parameter | Pflicht | Beschreibung | | ------------- | ------- | ----------------------------------------------------------------- | | `from` / `to` | ja | Zeitraum, ISO 8601. Max. 92 Tage Spanne, Rückblick max. 365 Tage. | ### `search_events` [Abschnitt betitelt „search\_events“](#search_events) Findet Termine per Text — case-insensitive Substring über Titel, Ort und Beschreibung. Die Suche ist bewusst **ein Filter über dieselben sichtbarkeits-gefilterten Daten wie `get_availability`**, kein zweiter Lesepfad: Kalender auf Stufe „Nur Geblockt” haben keine Titel und können darum nie matchen — das sagt die Antwort als Warnung dazu. „Kein Treffer” ist also nie ein Beweis, dass es den Termin nicht gibt. | Parameter | Pflicht | Beschreibung | | ------------- | ------- | -------------------------------------------------------------- | | `query` | ja | Suchtext (min. 2 Zeichen) | | `from` / `to` | nein | Zeitraum wie bei `get_availability`; Standard: −7 bis +85 Tage | Maximal 50 Treffer (chronologisch die frühesten), `truncated` zeigt an, wenn gekappt wurde. ### `send_feedback` [Abschnitt betitelt „send\_feedback“](#send_feedback) Die Benachrichtigung ans Team lässt sich nach dem Versand nicht zurückholen. Das Tool trägt deshalb `destructiveHint: true`, obwohl es keine Kalendertermine verändert. Schickt Feedback des Nutzers ans Kalender-Sync-Team — etwa wenn etwas gewünscht wurde, das die Tools noch nicht können. Der Assistent ist angewiesen, das Tool **nur auf ausdrückliche Bitte** zu nutzen. `contact_ok` (Standard: aus, auch bei Bugmeldungen) erlaubt genau **eine** themenbezogene Rückmeldung von uns — kein Newsletter, kein Verteiler. Details zur Verarbeitung in der [Datenschutzerklärung, Ziffer 3.10](https://kalender-sync.de/datenschutz/). | Parameter | Pflicht | Beschreibung | | ------------ | ------- | ------------------------------------------------------------------------ | | `message` | ja | Das Feedback (10–2000 Zeichen) | | `category` | ja | `missing_capability` · `bug` · `other` | | `contact_ok` | nein | Nur wenn der Nutzer einer einmaligen Antwort ausdrücklich zugestimmt hat | ## Schreib-Tools (alle Tarife, pro Kalender freigegeben) [Abschnitt betitelt „Schreib-Tools (alle Tarife, pro Kalender freigegeben)“](#schreib-tools-alle-tarife-pro-kalender-freigegeben) Getrennte Freigaben pro Kalender: **Termine anlegen** und, darunter, **bestehende Termine ändern und löschen** sowie **Syncs in diesen Kalender verwalten** (siehe [Sync-Tools](#sync-tools)). Ohne die zweite kann der Assistent nur anfassen, was er selbst angelegt hat — deine bestehenden Termine sind dann technisch nicht adressierbar. Beim Verbinden öffnet **das Regler-Symbol neben der Zugriffsangabe** diese Rechte; neue ausgewählte Kalender starten mit den maximal verfügbaren Rechten, die vor der Freigabe eingeschränkt werden können. Mehr dazu unter [Schreibzugriff](/ki-assistent/schreibzugriff/). ### `create_event` [Abschnitt betitelt „create\_event“](#create_event) Legt einen Termin in einem beschreibbaren Kalender an. Die Verfügbarkeit wird **im Moment des Schreibens live geprüft** (nicht aus dem Cache): Eine Überschneidung verhindert das Anlegen nicht, kommt aber als Warnung zurück — ob doppelt gebucht werden soll, entscheidet der Nutzer. Gezählt wird dabei nur, was die Zeit wirklich belegt (`blocks_time: true`). Feiertage, Geburtstage und ganztägige Termine aus Apple/iCloud lösen bewusst keine Warnung aus, sonst wäre jede Buchung an einem Feiertag ein vermeintlicher Konflikt. Keine Warnung heißt also nicht, dass der Tag leer ist. `start`/`end` verlangen ISO 8601 **mit Zeitzone**; `calendar_id` ist nur bei mehreren beschreibbaren Kalendern nötig — welche das sind, zeigt `list_calendars` über `writable: true`. Fehlt die Angabe bei mehreren, nennt die Fehlermeldung die zulässigen Kalender. ### `update_event` · `delete_event` [Abschnitt betitelt „update\_event · delete\_event“](#update_event--delete_event) Ändern bzw. löschen einen Termin. Adressierbar sind zwei Arten: 1. **Termine, die dieser Zugriff selbst angelegt hat** (per `event_id` aus `create_event`) — immer. 2. **Bestehende Termine** in einem Kalender, für den du „ändern und löschen” freigegeben hast — per `event_id` aus `get_availability` oder `search_events`. Für den zweiten Fall gelten vier Bedingungen, und jede Absage nennt den Weg: der Kalender ist freigegeben, mit **Alle Details** geteilt, der Termin ist **keine synchronisierte Kopie** (sonst überschreibt der nächste Sync die Änderung — die Absage nennt den Quellkalender), und **du bist Organisator**. Eine fremde Einladung lässt sich nicht umschreiben; dafür gibt es `respond_to_event`. Geändert wird nur, was der Aufruf nennt — Erinnerungen, Teilnehmer und Wiederholungsregeln bleiben, auch bei CalDAV. Die `event_id` eines einzelnen Datums einer Serie ändert bzw. löscht nur dieses Datum. Hat der Termin Teilnehmer, benachrichtigt der Anbieter sie über die Änderung oder Absage. Nicht adressierbare Termine antworten `not_found`, nicht `forbidden` — um nicht einmal die Existenz zu bestätigen. Löschungen werden beim Anbieter ausgeführt und propagieren über den normalen Sync in gespiegelte Kalender. Beide Tools tragen die MCP-Annotation `destructiveHint: true`. ### `respond_to_event` [Abschnitt betitelt „respond\_to\_event“](#respond_to_event) Beantwortet eine **fremde Einladung**: zusagen, absagen oder vorläufig zusagen. Der Organisator wird benachrichtigt — das ist der Zweck: eine Einladung nur zu löschen entfernt sie lokal und lässt ihn weiter mit dir rechnen. Die Berechtigung ist dieselbe wie fürs Ändern, die Bedingung aber die **umgekehrte**: Ändern setzt voraus, dass du Organisator bist, Beantworten setzt voraus, dass du es nicht bist. Bei einem **wiederkehrenden** Termin ist `scope` nötig — `occurrence` beantwortet nur dieses Datum, `series` alle. Ohne Angabe fragt der Assistent nach, statt zu raten: Eine Absage an den Organisator lässt sich nicht zurücknehmen. Verfügbar für **Google, Microsoft und CalDAV-Server mit Scheduling** (RFC 6638 — z. B. KSuite, WEB.DE). **iCloud** stellt Antworten nur an Organisatoren zu, die selbst iCloud nutzen; Einladungen von außen (Google, Outlook) legt iCloud gar nicht selbst in den Kalender. Bei CalDAV stellt der Server die Antwort zu; kann er das nicht, antwortet das Tool `not_supported` und verweist auf die Kalender-App, statt eine Antwort zu schicken, die niemand bekommt. Ein `comment` kommt bei CalDAV nicht mit; die Antwort geht trotzdem raus, und `warnings` sagt es. ## Sync-Tools [Abschnitt betitelt „Sync-Tools“](#sync-tools) Sieben Tools für deine [Syncs](/ki-assistent/syncs/), alle **0 Credits**. Sie setzen den OAuth-Scope `sync.manage` voraus, den jeder Zugriff standardmäßig hat. `create_sync`, `set_sync_paused`, `preview_delete_sync` und `delete_sync` erscheinen zusätzlich nur, wenn mindestens ein Kalender den Haken „Syncs in diesen Kalender verwalten” hat; `list_calendars` meldet solche Kalender mit `sync_target: true`. Kalender außerhalb deiner Freigabe erscheinen mit `id: null` und `name: null` — der Sync selbst wird nicht versteckt. Nennt ein Aufruf einen nicht freigegebenen, fremden oder nicht existierenden Kalender, ist die Antwort in allen drei Fällen dieselbe. ### `list_syncs` [Abschnitt betitelt „list\_syncs“](#list_syncs) Listet deine eigenen Syncs: `sources`, `target`, `kind` (`own_calendars` oder `shared_with_person` — bei Letzterem wird der Kalender der anderen Person nie genannt), `two_way`, `status` (`active` · `paused` · `error`), `reason`, `next_step` und `next_step_url`. Ein Zwei-Wege-Sync ist **ein** Eintrag. Offene Einladungen und beendete Syncs fehlen. Seit 1.9.1 enthält jeder Eintrag `event_colors`: `off`, `source` (Kopien behalten ihre Farben), `fixed` (eine Farbe je Quellkalender) oder `mixed` (die beiden Richtungen eines Zwei-Wege-Syncs unterscheiden sich). `reason` ist eine geschlossene Liste: `user_paused`, `plan_limit`, `source_unavailable`, `target_unavailable`, `account_needs_reconnect`, `updating`, `sync_error`, `other`. Fehlertexte von Anbietern werden nie weitergereicht. `ref` (`sync_1`, `sync_2`, …) ist die Eingabe für `diagnose_sync` und `set_sync_paused`; sie ist positionsbasiert (älteste zuerst) und gilt nur für das aktuelle Ergebnis. *Parameter: keine.* ### `diagnose_sync` [Abschnitt betitelt „diagnose\_sync“](#diagnose_sync) Derselbe Eintrag für einen Sync, zusätzlich `explanation` (ein fester Satz je Grund), `last_synced_at` und `error_since`. Bei `other` und `sync_error` wird kein nächster Schritt behauptet. | Parameter | Pflicht | Beschreibung | | --------- | ------- | ----------------------------------------------- | | `ref` | ja | `ref` aus einem aktuellen `list_syncs`-Ergebnis | ### `preview_sync` [Abschnitt betitelt „preview\_sync“](#preview_sync) Prüft, ob ein Sync angelegt werden könnte — in eine Richtung oder in beide —, ohne etwas anzulegen. Liefert `can_create`, **alle** `blockers` auf einmal, `max_detail_level` (die höchste Detailstufe, die dieser Zugriff von der Quelle sieht) und bei Zwei-Wege `max_reverse_detail_level` für die Rückrichtung. Eine Kopienzahl wird bewusst nicht genannt (`effect: "ongoing_copy_unknown_volume"`). Eine positive Vorschau ist keine Reservierung. Mögliche `blockers`: `same_calendar`, `already_connected`, `reverse_sync_exists`, `would_create_cycle`, `target_read_only`, `account_needs_reconnect`, `detail_level_above_access`, `plan_sync_limit_reached`, `plan_excludes_own_calendar_sync`, `plan_excludes_event_colors` (seit 1.9.0, nur wenn `event_colors: true` ausdrücklich angefragt ist). | Parameter | Pflicht | Beschreibung | | ---------------------- | ------- | ---------------------------------------------------------------------------------------------------- | | `source_calendar_id` | ja | Quellkalender, muss freigegeben sein | | `target_calendar_id` | ja | Zielkalender, muss für Syncs freigegeben sein (`sync_target: true` in `list_calendars`) | | `detail_level` | nein | `busy_only` · `title_and_time` · `full_details`; prüft zusätzlich gegen `max_detail_level` | | `direction` | nein | `one_way` (Standard) · `two_way`; bei Zwei-Wege müssen beide Kalender freigegeben und Sync-Ziel sein | | `reverse_detail_level` | nein | Nur Zwei-Wege: Detailstufe der Rückrichtung, Standard = `detail_level` | | `event_colors` | nein | Seit 1.9.0: prüft, ob der Tarif [Terminfarben](/sync/event-colors/) erlaubt | ### `create_sync` [Abschnitt betitelt „create\_sync“](#create_sync) Legt einen **Sync zwischen zwei eigenen Kalendern** an — in eine Richtung oder als Zwei-Wege-Sync —, nachdem du Quelle, Ziel, Richtung und Detailstufe(n) im Chat bestätigt hast. Bei Zwei-Wege entstehen beide Richtungen zusammen oder gar nicht (`legs: 2`). Alle Prüfungen der Vorschau laufen erneut. Antwort: `status: "created_pending_processing"` — der Sync existiert, kopiert wird im Hintergrund, der Zielkalender kann ein paar Minuten leer wirken. `syncs_url` verlinkt die App. Der Sync läuft auch nach einem Widerruf des Zugriffs weiter. Idempotent über `request_id`: dieselbe ID mit denselben Angaben liefert denselben Sync (`replayed: true`), dieselbe ID mit anderen Angaben scheitert. Annotation: `destructiveHint: true`. Terminfarben (`event_colors`, seit 1.9.0): Farben kommen mit ihrem Namen an (Google-Labels, Outlook-Kategorien). Umbenennungen und, falls Microsoft sie verlangt, die Erlaubnis zum Anlegen von Kategorien legst du in der App fest (`syncs_url`). Ohne diese Erlaubnis läuft der Sync in der Kalenderfarbe. | Parameter | Pflicht | Beschreibung | | ---------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------- | | `source_calendar_id` | ja | Quellkalender | | `target_calendar_id` | ja | Zielkalender | | `detail_level` | ja | `busy_only` · `title_and_time` · `full_details`, höchstens `max_detail_level` | | `request_id` | ja | Stabile ID (8–100 Zeichen), bei Wiederholung dieselbe | | `direction` | nein | `one_way` (Standard) · `two_way` | | `reverse_detail_level` | nein | Nur Zwei-Wege, höchstens `max_reverse_detail_level` | | `event_colors` | nein | Seit 1.9.0: [Terminfarben übernehmen](/sync/event-colors/), für alle Richtungen. Standard wie in der App: an, außer bei `busy_only` | ### `set_sync_paused` [Abschnitt betitelt „set\_sync\_paused“](#set_sync_paused) Setzt einen **Zielzustand**, schaltet also nicht um: Einen pausierten Sync noch einmal zu pausieren ändert nichts (`changed: false`). Bei Zwei-Wege-Syncs gilt es für beide Richtungen. Pausieren löscht nichts. Nur für Syncs, deren Zielkalender für Syncs freigegeben ist; vom Tarif, von einem fehlenden Kalender oder einer laufenden Umstellung angehaltene Syncs werden nicht fortgesetzt. Annotation: `destructiveHint: true`. | Parameter | Pflicht | Beschreibung | | --------- | ------- | ----------------------------------------------- | | `ref` | ja | `ref` aus einem aktuellen `list_syncs`-Ergebnis | | `paused` | ja | `true` = pausiert, `false` = läuft | ### `preview_delete_sync` [Abschnitt betitelt „preview\_delete\_sync“](#preview_delete_sync) Zeigt, was das Löschen eines Syncs bewirken würde, ohne etwas zu löschen: welche Kalender er verbindet und **wie viele Kopien** entfernt würden (`copies_to_remove`, aus den gespeicherten Zuordnungen gezählt). Liefert ein `confirmation_token`, gültig 10 Minuten, nur für diesen Zugriff und genau diesen Sync. Nur lesend. | Parameter | Pflicht | Beschreibung | | --------- | ------- | ----------------------------------------------- | | `ref` | ja | `ref` aus einem aktuellen `list_syncs`-Ergebnis | ### `delete_sync` [Abschnitt betitelt „delete\_sync“](#delete_sync) Löscht den Sync — nur mit dem `confirmation_token` aus `preview_delete_sync` und nur, nachdem du im Chat zugestimmt hast. Beide Richtungen eines Zwei-Wege-Syncs enden zusammen; alle Kopien im Zielkalender werden im Hintergrund entfernt, die Originaltermine bleiben unberührt. Nicht rückgängig zu machen. Antwort: `status: "deleted_cleanup_pending"`, `copies_removed`. Ein abgelaufenes, gefälschtes oder für einen anderen Sync ausgestelltes Token löscht nichts. Annotation: `destructiveHint: true`. | Parameter | Pflicht | Beschreibung | | -------------------- | ------- | ---------------------------------- | | `ref` | ja | Dieselbe `ref` wie in der Vorschau | | `confirmation_token` | ja | Token aus `preview_delete_sync` | Regeln ändern, Richtung umkehren und Syncs mit anderen Personen gibt es bewusst nur in der App. ## Protokollierung [Abschnitt betitelt „Protokollierung“](#protokollierung) Jeder Tool-Aufruf landet als **Metadaten** im [Zugriffsprotokoll](/ki-assistent/) — Zeitpunkt, Tool, betroffene Kalender, Ergebnis. Nie der Inhalt deiner Termine, nie der Suchtext, nie der Feedback-Wortlaut. *** *Stand: Server-Version 1.7.0. Der Server ist im [offiziellen MCP Registry](https://registry.modelcontextprotocol.io/v0.1/servers?search=de.kalender-sync) als `de.kalender-sync/kalender-sync` gelistet. Er stellt die Tool-Liste bei jeder Verbindung neu zusammen, Clients cachen sie aber — nach einer Rechte-Änderung musst du sie im Client [neu laden](/ki-assistent/schreibzugriff/#schreibzugriff-nachtr%C3%A4glich-aktivieren).* # Mit Zapier verbinden > Kalender Sync im MCP Client by Zapier nutzen — Kalender-Tools als normale Zap-Steps, ganz ohne KI-Modell. Schritt-für-Schritt-Anleitung und Zap-Ideen. Zapier bindet Kalender Sync über den **MCP Client by Zapier** ein — und zwar als ganz normalen **Action-Step**. Das ist der große Unterschied zu n8n: Du brauchst **kein KI-Modell** im Zap. Der Step ruft ein Kalender-Tool direkt auf, und die Antwort kommt als einzeln mappbare Felder zurück, die du in jedem Folge-Step verwenden kannst — deterministisch, ohne Prompt, ohne Modellkosten. Die Adresse (MCP-Server-URL), die du unten einträgst, ist: ```plaintext https://app.kalender-sync.de/mcp ``` Voraussetzungen * Ein Kalender-Sync-Konto mit [verbundenen Kalendern](/getting-started/connect-first-calendar/) — Lesen und [Termine anlegen](/ki-assistent/schreibzugriff/) gehen in jedem Tarif. * Ein Zapier-Konto. Der **MCP Client by Zapier** ist eine Beta-Integration von Zapier. * Ein **Zugriffs-Schlüssel** aus der App (Schritt 1). ## 1. Zugriff und Schlüssel in Kalender Sync erstellen [Abschnitt betitelt „1. Zugriff und Schlüssel in Kalender Sync erstellen“](#1-zugriff-und-schlüssel-in-kalender-sync-erstellen) Öffne in der App **KI-Assistent → Assistent verbinden** und wähle **Zapier**. Du wählst die Kalender einzeln aus und stellst je Kalender die [Detailtiefe](/ki-assistent/sichtbarkeit/) ein — nicht freigegebene Kalender existieren für Zapier nicht. Mit **Schlüssel erstellen** bekommst du deinen Zugriffs-Schlüssel (ein Token, beginnt mit `ksa_`). Er wird **nur einmal angezeigt** — kopiere ihn direkt in die Zapier-Verbindung (Schritt 2). Behandle ihn wie ein Passwort. ## 2. Verbindung in Zapier anlegen [Abschnitt betitelt „2. Verbindung in Zapier anlegen“](#2-verbindung-in-zapier-anlegen) 1. Erstelle einen Zap und füge als Action **MCP Client by Zapier** hinzu (Event: **Run Tool**). 2. Lege eine neue **Connection** an: * **Server URL:** `https://app.kalender-sync.de/mcp` * **Requires OAuth:** **No** — wichtig! Der Zapier-OAuth-Weg wird von uns aktuell nicht unterstützt; die Verbindung läuft über den Token. * **Bearer Token:** dein `ksa_…`-Token aus Schritt 1 (nur der Token selbst, ohne den Präfix „Bearer”). 3. Steht die Verbindung, zeigt Zapier im **Configure**-Schritt die verfügbaren Tools an: `list_calendars`, `get_availability`, `search_events` und (bei freigeschaltetem Schreibzugriff) `create_event`, `update_event`, `delete_event`. Details zu jedem Tool: [Tool-Referenz](/ki-assistent/tool-referenz/). ## 3. Testen und Felder mappen [Abschnitt betitelt „3. Testen und Felder mappen“](#3-testen-und-felder-mappen) Wähle als Tool `list_calendars` und führe den **Test** aus. Unter **Data out** findest du das Ergebnis doppelt: * als Rohtext (`Response → Text`) und * als **strukturierte Einzelfelder** (`Structured Content → Calendars → …`): Name, Provider, Sichtbarkeit (`Visibility`), Lesbarkeit (`Readable`), Schreibbarkeit (`Writable`), Sync-Status — und vor allem die **Calendar `Id`**. Die **Calendar Id** brauchst du für alle weiteren Tools: `get_availability`, `search_events` und `create_event` erwarten sie als Argument. Am einfachsten führst du `list_calendars` einmal im Test aus, kopierst die Id deines Zielkalenders und trägst sie in den Folge-Steps fest ein. Für `create_event` muss der Zielkalender `Writable: true` haben. Jeder Aufruf landet im [Zugriffsprotokoll](/ki-assistent/#was-in-deiner-hand-bleibt) auf der Seite **KI-Assistent**. ## Zap-Ideen [Abschnitt betitelt „Zap-Ideen“](#zap-ideen) **Termin aus Formular — ohne KI.** Typeform/Google-Forms/Jotform-Trigger → **Run Tool: `create_event`** mit gemappten Feldern (Titel aus dem Formular, Start/Ende aus dem gewählten Slot, deine Calendar Id). Der klassische „Buchung ins System”-Zap, nur dass der Termin bei Google, Outlook oder GMX landet — je nachdem, welchen Kalender du freigegeben hast. (Kalender mit [Schreibzugriff](/ki-assistent/schreibzugriff/).) **Freie Slots an neue Leads.** CRM-Trigger (neuer Lead in HubSpot/Pipedrive) → **Run Tool: `get_availability`** für die nächsten Werktage → Folge-Step formatiert die freien Fenster → E-Mail-Entwurf „Diese Zeiten kann ich anbieten”. Die Verfügbarkeit kommt über **alle** freigegebenen Kalender — Doppelbuchungen zwischen Job- und Privatkalender sind damit ausgeschlossen. **Tagesübersicht nach Slack.** Schedule by Zapier (werktags 7 Uhr) → **Run Tool: `search_events`** für heute → Formatter → Slack-Nachricht. Ganz ohne Modell: Die Felder aus `Structured Content` lassen sich direkt in die Nachricht mappen. **Blocker nach Feierabend.** Trigger aus deinem Projekt-Tool (z. B. neue Deadline in Asana) → **Run Tool: `create_event`** legt automatisch einen Fokus-Block vor der Deadline an. Wann Zapier, wann n8n? Feste Abläufe mit klaren Feldern (Formular → Termin, Zeitplan → Übersicht) sind in Zapier einfacher — kein Modell, keine Prompt-Pflege, planbare Kosten. Freie Fragen in natürlicher Sprache („Wann habe ich diese Woche zwei Stunden am Stück?”) brauchen einen Agenten — dafür ist [n8n mit AI Agent](/ki-assistent/n8n/) der bessere Ort. ## Problemlösung [Abschnitt betitelt „Problemlösung“](#problemlösung) * **Verbindung lässt sich nicht anlegen:** Prüfe zuerst **Requires OAuth: No** — mit „Yes” schlägt die Verbindung bei uns derzeit fehl. Der MCP Client ist bei Zapier Beta; falls es mit korrektem Token trotzdem hakt, hilft oft ein zweiter Versuch einige Minuten später. * **401 / „Unauthorized”:** Token falsch kopiert, abgelaufen oder [widerrufen](/ki-assistent/#zugang-widerrufen). Zur Not in der App einen neuen Token erstellen und die Connection aktualisieren. * **Ein Kalender fehlt im Ergebnis:** Er ist für diesen Zugang nicht freigegeben — in der App unter **KI-Assistent → Freigabe bearbeiten** ergänzen. Änderungen wirken sofort, ohne neuen Token. Hast du ihn erst nach dem Verbinden angelegt: [Neu angelegte Kalender](/ki-assistent/#neu-angelegte-kalender). * **`create_event` schlägt fehl:** Schreibzugriff gibt es [in jedem Tarif](/ki-assistent/schreibzugriff/), muss aber pro Kalender freigeschaltet sein — und die Ziel-Calendar-Id muss zu einem schreibfreigegebenen Kalender gehören. * **Termine ohne Titel im Ergebnis:** Der Kalender steht auf „Nur Geblockt” — [Sichtbarkeit](/ki-assistent/sichtbarkeit/) zeigt dann bewusst keine Titel. ## Sicherheit & Kontrolle [Abschnitt betitelt „Sicherheit & Kontrolle“](#sicherheit--kontrolle) Für Zapier gilt dasselbe wie für jeden Assistenten-Zugang: Du bestimmst [pro Kalender, was sichtbar ist](/ki-assistent/sichtbarkeit/), jede Abfrage wird protokolliert (nie der Termininhalt), und der [Widerruf in Kalender Sync](/ki-assistent/#zugang-widerrufen) macht den Token sofort ungültig — egal, was in Zapier gespeichert ist. Der Token gehört ausschließlich in die Zapier-Connection, nicht in Notizen, Formeln oder geteilte Dokumente. # Was sind Abo-Kalender? > Mit Abo-Kalendern veröffentlichst du deine Termine als Kalender zum Abonnieren. Kalender Sync hostet Feed, Abo-Seite und einen Button für deine Website. Ohne Tracker, in der EU gehostet. Mit **Abo-Kalendern** machst du die Termine deines Vereins, deiner Kurse oder deiner Veranstaltungen abonnierbar. Besucher fügen deinen Kalender einmal in ihre Kalender-App ein. Neue und geänderte Termine erscheinen dort danach von selbst, ohne dass jemand etwas abtippen muss. Kalender Sync hostet dafür drei Dinge für dich: * **Einen Kalender-Feed** (ICS) unter `feeds.kalender-sync.de`. Diesen Feed abonnieren die Kalender-Apps deiner Besucher. * **Eine Abo-Seite** unter `app.kalender-sync.de/subscribe/` mit deinem Logo, Banner, Veranstalter, den kommenden Terminen und einem Button mit App-Auswahl. → [Die Abo-Seite](/abo-kalender/abo-seite/) * **Einen Button für deine Website**, den du mit zwei Zeilen HTML einbaust. → [Button einbauen](/abo-kalender/button/) ## Für wen ist das? [Abschnitt betitelt „Für wen ist das?“](#für-wen-ist-das) * **Vereine**, die Spieltage, Trainings und Feste veröffentlichen. * **Kursanbieter und Studios**, deren Stundenplan sich immer wieder ändert. * **Schulen und Bildungsträger** mit Ferien, Elternabenden und Projekttagen. * **Websites mit Kalender-Plugin**, etwa WordPress mit Pie Calendar. Das Plugin schreibt die Termine, Kalender Sync stellt sie zum Abonnieren bereit. ## Wie kommen die Termine in den Kalender? [Abschnitt betitelt „Wie kommen die Termine in den Kalender?“](#wie-kommen-die-termine-in-den-kalender) Abo-Kalender werden über die **Publisher API** befüllt. Dafür gibt es drei Wege: 1. **Ein Plugin oder Tool, das die Publisher API unterstützt.** Du legst in Kalender Sync unter **Einstellungen › Entwickler / API** einen Key an und trägst ihn im Plugin ein. Ab dann schreibt das Plugin jede Änderung in deinen Abo-Kalender. 2. **Eigene Entwicklung.** Deine Website oder dein System spricht die API direkt an. → [Publisher API](/api/) 3. **Dein KI-Assistent.** Über den Kalender Sync MCP-Server kann ein Assistent Abo-Kalender anlegen und Termine pflegen. Die Anleitung dazu folgt, sobald die Funktion freigeschaltet ist. Zum Ausprobieren reicht der Free-Tarif: Mit einem **Sandbox-Key** legst du Testkalender an, die in echten Kalender-Apps funktionieren. → [Tarife und Limits](/abo-kalender/tarife/) ## Wie schnell kommen Änderungen bei Abonnenten an? [Abschnitt betitelt „Wie schnell kommen Änderungen bei Abonnenten an?“](#wie-schnell-kommen-änderungen-bei-abonnenten-an) Kalender-Apps holen abonnierte Kalender nach ihrem eigenen Zeitplan ab. Sobald du einen Termin änderst, liefert der Feed beim nächsten Abruf die neue Fassung aus. Wann die App das nächste Mal abruft, entscheidet die App: * **Google Kalender:** meist nach einigen Stunden, manchmal später. * **Apple Kalender und Outlook:** unterschiedlich, je nach App und Einstellung. Mehr dazu in den [häufigen Fragen](/abo-kalender/faq/#wie-schnell-kommen-%C3%A4nderungen-bei-abonnenten-an). ## Datenschutz [Abschnitt betitelt „Datenschutz“](#datenschutz) * **Keine Tracker, kein Cookie-Banner.** Abo-Seite und Button laden nur von unserer eigenen Domain. * **Wir speichern nicht, wer abonniert.** Keine IP-Adresse, kein User-Agent. Wir zählen nur, wie viele Kalender-Apps den Feed abrufen. → [Statistik](/abo-kalender/statistik/) * **Hosting in der EU, DSGVO-konform.** Die Termininhalte liegen verschlüsselt in unserer Datenbank. * Der Hinweis „Du hast schon abonniert“ auf der Abo-Seite liegt nur im Browser des Besuchers. ## Nächste Schritte [Abschnitt betitelt „Nächste Schritte“](#nächste-schritte) * [Die Abo-Seite](/abo-kalender/abo-seite/): was Besucher sehen * [Branding](/abo-kalender/branding/): Logo, Banner, Farbe, Veranstalter * [Button einbauen](/abo-kalender/button/): mit Live-Vorschau * [Publisher API: Schnellstart](/api/quickstart/): für Entwickler # Die Abo-Seite > Jeder Abo-Kalender hat eine gehostete Abo-Seite mit Logo, Banner, kommenden Terminen, App-Auswahl und Teilen-Funktionen. Ohne Tracker und ohne Cookie-Banner. Jeder Abo-Kalender bekommt eine eigene Seite unter ```plaintext https://app.kalender-sync.de/subscribe/cal_XXXXXXXXXXXX ``` Diese Seite kannst du verlinken, als QR-Code aushängen oder in Newslettern teilen. Der [Button für deine Website](/abo-kalender/button/) führt Besucher ebenfalls dorthin, wenn sie „Andere App“ wählen. ## Was Besucher sehen [Abschnitt betitelt „Was Besucher sehen“](#was-besucher-sehen) * **Banner, Logo und Name** deines Kalenders, darunter die Beschreibung. → [Branding](/abo-kalender/branding/) * **Veranstalter** mit Link zu deiner Website und, falls hinterlegt, einem Kontakt-Link per E-Mail. * **Kommende Termine**, wenn du sie freigibst: Titel, Datum, Uhrzeit, Ort und eine kurze Beschreibung. Die Seite zeigt die Termine der nächsten zwölf Monate, höchstens 50. Zeiten stehen in der Zeitzone des Kalenders; Besucher in einer anderen Zeitzone können auf ihre eigene umschalten. * **Den Button „Kalender abonnieren“** mit der Auswahl der Kalender-App. * **Teilen:** Links für WhatsApp, Facebook, LinkedIn, X und E-Mail, das Teilen-Menü des Geräts (wo verfügbar) und einen QR-Code, der im Browser erzeugt wird. * Einen kurzen Hinweis, was „Kalender abonnieren“ bedeutet, und den Satz „Wir speichern nicht, wer abonniert.“ * Einen Link **„Inhalt melden“**, falls jemand einen Missbrauch melden möchte. Die Seite erscheint in der Sprache, die du für den Kalender eingestellt hast (Deutsch oder Englisch). ## Unterstützte Kalender-Apps [Abschnitt betitelt „Unterstützte Kalender-Apps“](#unterstützte-kalender-apps) Im Menü stehen: | Eintrag | Was passiert | | ----------------- | ------------------------------------------------------------------------------------- | | Apple Kalender | Öffnet den Abo-Dialog auf iPhone, iPad oder Mac (`webcal://`). | | Google Kalender | Öffnet Google Kalender im Browser mit dem Abo. | | Microsoft 365 | Öffnet Outlook im Web für Geschäfts- und Schulkonten. | | Outlook.com | Öffnet Outlook im Web für private Microsoft-Konten. | | Outlook (Desktop) | Öffnet die installierte Outlook-App (`webcal://`). | | Andere App | Zeigt den Feed-Link zum Kopieren, für jede App, die Kalender per URL abonnieren kann. | Die Seite sortiert die passende App für das Gerät des Besuchers nach oben, zum Beispiel Apple Kalender auf dem iPhone. ## Datenschutz auf der Abo-Seite [Abschnitt betitelt „Datenschutz auf der Abo-Seite“](#datenschutz-auf-der-abo-seite) * **Kein Cookie-Banner, keine Tracker.** Die Seite lädt nur von unserer eigenen Domain. Die Teilen-Buttons sind einfache Links, der QR-Code entsteht im Browser. * **Wir speichern nicht, wer abonniert.** Jedes Abo bekommt einen eigenen Feed-Link, damit wir zählen können, wie viele Kalender-Apps den Kalender abrufen. Eine IP-Adresse oder einen User-Agent speichern wir dazu nicht. * Hat ein Besucher schon einmal abonniert, weist die Seite freundlich darauf hin. Diese Information liegt nur im Browser des Besuchers (localStorage), nicht bei uns. * Abo-Seiten sind für Suchmaschinen **nicht indexierbar** (`noindex`). Besucher kommen über deine Website, deinen Button oder deine Links. ## Testkalender [Abschnitt betitelt „Testkalender“](#testkalender) Kalender, die mit einem Sandbox-Key angelegt wurden, zeigen oben auf der Abo-Seite den Hinweis „Testkalender“. Im Feed beginnt ihr Name mit `[TEST]`. So kann niemand einen Testkalender mit dem echten verwechseln. → [Tarife und Limits](/abo-kalender/tarife/) ## Wenn ein Kalender gelöscht wird [Abschnitt betitelt „Wenn ein Kalender gelöscht wird“](#wenn-ein-kalender-gelöscht-wird) Löschst du einen Abo-Kalender, ist die Abo-Seite nicht mehr erreichbar. Der Feed liefert noch 30 Tage lang einen leeren Kalender mit dem Hinweis, dass der Veranstalter ihn entfernt hat. So verschwinden die Termine auch bei bestehenden Abonnenten. Danach antwortet der Feed mit `410 Gone`. # Branding > Logo, Banner, Markenfarbe, Veranstalter und die Frage, ob Termine öffentlich auf der Abo-Seite stehen. Was du einstellen kannst und welche Bilder passen. Die Abo-Seite zeigt deinen Kalender, nicht Kalender Sync. Diese Angaben kannst du setzen: | Einstellung | Wirkung | API-Feld | | ------------------ | ------------------------------------------------------------------------------------------------- | ------------- | | Name | Überschrift der Abo-Seite und Name des Kalenders in der App deiner Abonnenten (bis 100 Zeichen). | `name` | | Beschreibung | Text unter dem Namen, auch im Feed (bis 1.000 Zeichen). | `description` | | Website | Link „Zur Website“ auf der Abo-Seite, nur `https://`. | `site_url` | | Sprache | Sprache der Abo-Seite: Deutsch oder Englisch. Standard: Englisch. | `language` | | Zeitzone | Zeitzone, in der deine Termine gelten, zum Beispiel `Europe/Berlin`. | `timezone` | | Markenfarbe | Farbe der Abo-Seite als Hex-Wert, zum Beispiel `#0f766e`. Die Schriftfarbe passt sich an. | `brand_color` | | Veranstalter | Name, optional Website und Kontakt-E-Mail. Alles davon ist auf der Abo-Seite öffentlich sichtbar. | `organizer` | | Termine öffentlich | Ob die kommenden Termine auf der Abo-Seite stehen. Standard: an. | `show_events` | | Logo | Quadratisches Bild neben dem Namen. | Bild-Upload | | Banner | Breites Bild oben auf der Seite. | Bild-Upload | Gesetzt werden die Angaben über die Publisher API, also meist von deinem Plugin oder deinem Entwickler. → [Kalender anlegen und ändern](/api/calendars/) ## Logo und Banner [Abschnitt betitelt „Logo und Banner“](#logo-und-banner) | | Logo | Banner | | ---------- | ------------------------------------ | ---------------------------------- | | Formate | PNG, JPEG, WebP | PNG, JPEG, WebP | | Dateigröße | bis 512 KB | bis 2 MB | | Empfehlung | quadratisch, mindestens 192 × 192 px | etwa 3:1, mindestens 1200 px breit | **SVG nehmen wir nicht an**, auch nicht als Logo: SVG kann Skripte enthalten. Wir speichern die Bilder selbst und liefern sie von unserer Domain aus. Besucher der Abo-Seite laden also nichts von fremden Servern. → [Bilder hochladen](/api/images/) ## Termine öffentlich: ja oder nein? [Abschnitt betitelt „Termine öffentlich: ja oder nein?“](#termine-öffentlich-ja-oder-nein) Mit `show_events` steuerst du, ob die Abo-Seite die kommenden Termine auflistet. * **An (Standard):** Besucher sehen vor dem Abonnieren, was sie erwartet. Das überzeugt meist mehr als ein leerer Button. * **Aus:** Die Abo-Seite zeigt nur Name, Beschreibung, Veranstalter und den Button. Wer abonniert, bekommt die Termine trotzdem in seine Kalender-App, denn der Feed ist davon nicht betroffen. Der Feed selbst ist immer öffentlich für alle, die den Link haben. Veröffentliche in Abo-Kalendern deshalb nur Termine, die öffentlich sein dürfen. ## Button auf deiner Website [Abschnitt betitelt „Button auf deiner Website“](#button-auf-deiner-website) Der einbettbare Button nutzt nicht automatisch die Markenfarbe der Abo-Seite. Seine Farbe setzt du direkt im Snippet mit `data-color`. → [Button einbauen](/abo-kalender/button/) # Button einbauen > Den Abo-Button mit zwei Zeilen HTML auf deiner Website einbauen. Mit Live-Vorschau für Farbe, Text und Sprache. Keine Cookies, kein Tracking. Mit dem Button abonnieren Besucher deinen Kalender direkt auf deiner Website. Ein Klick öffnet die Auswahl der Kalender-App, ein zweiter Klick legt das Abo an. ## Live-Vorschau [Abschnitt betitelt „Live-Vorschau“](#live-vorschau) Probier Farbe, Text und Sprache aus. Der Button unten ist echt und gehört zu einem Demo-Kalender. Das Snippet darunter kopierst du auf deine Website. Live-Vorschau Farbe#0f766eButton-TextKalender abonnierenSpracheSeitensprache Button wird geladen… Snippet für deine WebsiteKopieren ``` ``` Ersetze cal\_XXXXXXXXXXXX durch die ID deines Kalenders. [Demo-Abo-Seite öffnen](https://app.kalender-sync.de/subscribe/cal_N89Q5UXumKb4) ## Snippet [Abschnitt betitelt „Snippet“](#snippet) ```html
``` Ersetze `cal_XXXXXXXXXXXX` durch die ID deines Kalenders. Die ID steht in deinem Plugin oder in der API-Antwort beim Anlegen (`id`). Das ` - Setze den Button dorthin, wo Besucher unsere Termine sehen. - Passe die Farbe mit data-color="#rrggbb" an unsere Markenfarbe an. - Binde das Script nur einmal pro Seite ein. - Falls die Seite eine Content-Security-Policy hat, erlaube script-src https://app.kalender-sync.de. - Falls die Seite Inhalte erst später rendert (SPA, Page-Builder), rufe danach window.KalenderSync?.mountButtons() auf. - Falls wir eigenes Analytics nutzen, erfasse Klicks über das Event ks:subscribe (event.detail.app). Doku: https://docs.kalender-sync.de/api/button/ ``` ## Copy-Prompt: Integration bauen [Abschnitt betitelt „Copy-Prompt: Integration bauen“](#copy-prompt-integration-bauen) ```text Baue eine Integration, die unsere Termine an die Kalender Sync Publisher API schickt. - OpenAPI: https://api.kalender-sync.de/v1/openapi.json - Doku: https://docs.kalender-sync.de/api/ (Markdown: Seiten-URL ohne abschließenden Schrägstrich plus .md) - Authentifizierung: Authorization: Bearer . Den Key nur serverseitig speichern, nie im Frontend. - Termine mit PUT /v1/publisher/calendars/{calendar_id}/events/{external_id} schreiben, external_id ist unsere eigene ID. - Beim Löschen oder Depublizieren DELETE auf denselben Pfad. - Für den Erstimport und einen täglichen Abgleich den Full Sync nutzen (syncs, batch mit sync_id, complete). - Fehler sind application/problem+json; "code" auswerten, nicht "detail". - Bei 429 den Header Retry-After beachten. - Teste zuerst mit einem Sandbox-Key (ks_test_). ``` ## Quellen für Agenten [Abschnitt betitelt „Quellen für Agenten“](#quellen-für-agenten) * **OpenAPI 3.1:** , öffentlich, ohne Key. * **Jede Doku-Seite als Markdown:** Hänge an die URL ohne abschließenden Schrägstrich `.md` an, zum Beispiel `https://docs.kalender-sync.de/api/events.md`. Oben auf jeder Seite gibt es außerdem „Markdown kopieren“. * **Alles auf einmal:** [llms.txt](https://docs.kalender-sync.de/llms.txt) und [llms-full.txt](https://docs.kalender-sync.de/llms-full.txt). * **Fehlercodes:** Das Feld `type` jeder Fehlerantwort zeigt direkt auf die passende Erklärung. → [Fehler](/api/errors/) ## Abo-Kalender per MCP [Abschnitt betitelt „Abo-Kalender per MCP“](#abo-kalender-per-mcp) Über den Kalender Sync MCP-Server pflegt dein KI-Assistent Abo-Kalender auch ohne API-Key. Wie du einen Assistenten verbindest, steht unter [KI-Assistent verbinden](/ki-assistent/). * **Freischalten:** Beim Verbinden den Haken **„Abo-Kalender verwalten (optional)“** aktiv setzen. Er ist nie vorausgewählt. Ist dein Assistent schon verbunden, verbinde ihn einmal neu und setze den Haken; bestehende Verbindungen bekommen das Recht nie automatisch. Das geht mit Claude und ChatGPT (auch Claude Code und Codex). Clients mit Zugangsschlüssel nutzen stattdessen die Publisher API. * **Werkzeuge:** `list_publisher_calendars`, `create_publisher_calendar`, `update_publisher_calendar`, `write_publisher_events` (bis zu 100 Termine je Aufruf, Ergebnis je Termin), `list_publisher_events`, `get_publisher_stats` und `get_subscribe_button`. * **Testmodus und live:** Neue Kalender startet der Assistent im Testmodus. Einen Live-Kalender legt er nur an, wenn du es ausdrücklich willst, ab Basic und nach deiner einmaligen Zustimmung zu den Zusatzbedingungen. Fehlt sie, kommt [`terms_required`](/api/errors/terms_required/) mit dem Link in die Einstellungen. * **Löschen:** Termine kann der Assistent löschen, einen ganzen Kalender nicht. Das geht nur über die API. * **Kosten:** Die Werkzeuge kosten keine Credits. # Authentifizierung > API-Keys für die Publisher API anlegen, sicher speichern und prüfen. Live- und Sandbox-Keys, Scopes, Widerruf. Jede Anfrage trägt einen API-Key als Bearer-Token: ```plaintext Authorization: Bearer ks_live_… ``` Ohne Header antwortet die API mit `401` [`missing_api_key`](/api/errors/missing_api_key/), mit falschem, widerrufenem oder abgelaufenem Key mit `401` [`invalid_api_key`](/api/errors/invalid_api_key/). Das gilt auch für unbekannte Pfade: Ohne gültigen Key bekommst du `401`, nicht `404`. So verrät die API nicht, welche Pfade es gibt. Öffentlich und ohne Key ist nur `GET /v1/openapi.json`. ## Keys anlegen [Abschnitt betitelt „Keys anlegen“](#keys-anlegen) Keys legst du in der [App](https://app.kalender-sync.de/) unter **Einstellungen › Entwickler / API** an. * **Sandbox-Key** (`ks_test_…`): in jedem Tarif. Sieht nur Testkalender. * **Live-Key** (`ks_live_…`): ab Basic. Sieht nur Live-Kalender. Der Key wird **genau einmal** angezeigt. Wir speichern nur einen Hash davon. Geht er verloren, legst du einen neuen an. Ein Konto kann bis zu **10 aktive Keys** haben, sodass du Keys ohne Unterbrechung austauschen kannst: neuen Key anlegen, im Plugin eintragen, alten widerrufen. ## Aufbau eines Keys [Abschnitt betitelt „Aufbau eines Keys“](#aufbau-eines-keys) ```plaintext ks_live_<32 Zeichen>_<6 Zeichen Prüfsumme> ks_test_<32 Zeichen>_<6 Zeichen Prüfsumme> ``` Die Prüfsumme am Ende erlaubt Secret-Scannern, einen geleakten Key zu erkennen, und uns, einen vertippten Key ohne Datenbankabfrage abzulehnen. Zugangsschlüssel für den MCP-Server (`ksa_…`) funktionieren hier nicht. ## Key prüfen: `GET /v1/me` [Abschnitt betitelt „Key prüfen: GET /v1/me“](#key-prüfen-get-v1me) Ideal für einen Button „Verbindung testen“ in deinem Plugin. ```bash curl https://api.kalender-sync.de/v1/me -H "Authorization: Bearer $KS_KEY" ``` ```json { "account_id": "…", "key": { "id": "…", "name": "Meine Website", "mode": "live", "scopes": ["publisher:read", "publisher:write", "publisher:stats"], "calendar_ids": null } } ``` | Feld | Bedeutung | | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `mode` | `live` oder `test` (Sandbox). | | `scopes` | Was der Key darf: `publisher:read` (lesen), `publisher:write` (anlegen, ändern, löschen), `publisher:stats` (Statistik). Keys aus den Einstellungen haben alle drei. | | `calendar_ids` | `null`, wenn der Key alle Kalender des Kontos sieht. Sonst die Liste der Kalender, auf die er beschränkt ist. Ein beschränkter Key kann keine neuen Kalender anlegen. | Fehlt ein Scope, antwortet die API mit `403` [`insufficient_scope`](/api/errors/insufficient_scope/). ## Sandbox und Live [Abschnitt betitelt „Sandbox und Live“](#sandbox-und-live) Beide Key-Arten sprechen dieselbe API unter derselben URL an. Ein Sandbox-Key sieht nur Testkalender, ein Live-Key nur Live-Kalender. Ein Kalender des jeweils anderen Modus antwortet mit `404` [`calendar_not_found`](/api/errors/calendar_not_found/). | | Sandbox | Live | | ------------------- | -------------------------- | --------------------------------------- | | Kalender je Konto | 3 | je nach Tarif: Basic 1, Professional 10 | | Termine je Kalender | 500 | 5.000 | | Name im Feed | mit `[TEST]` davor | wie angelegt | | Abo-Seite | mit Hinweis „Testkalender“ | ohne Hinweis | ## Key sicher aufbewahren [Abschnitt betitelt „Key sicher aufbewahren“](#key-sicher-aufbewahren) * Speichere den Key nur **serverseitig**, zum Beispiel in WordPress als Option, die nicht automatisch geladen wird. Nie im HTML, im JavaScript deiner Seite oder in einem öffentlichen Repository. * Schreibe ihn nicht in Logs oder Fehlermeldungen. * Der Button auf deiner Website braucht **keinen** Key, nur die Kalender-ID. ## Key widerrufen [Abschnitt betitelt „Key widerrufen“](#key-widerrufen) Unter **Einstellungen › Entwickler / API** auf **Widerrufen**. Das wirkt ab der nächsten Anfrage; alles, was den Key nutzt, bekommt dann `401 invalid_api_key`. Bestehende Kalender, Feeds und Abos bleiben unverändert. # Batch > Bis zu 100 Termine in einem Aufruf anlegen, ändern oder löschen. Jede Operation bekommt ihr eigenes Ergebnis; ein Fehler stoppt die anderen nicht. Für Importe und Massenänderungen schickst du bis zu **100 Operationen** in einem Aufruf. ```plaintext POST /v1/publisher/calendars/{calendar_id}/events/batch ``` ```bash curl https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/events/batch \ -H "Authorization: Bearer $KS_KEY" \ -H "Content-Type: application/json" \ -d '{ "operations": [ { "method": "PUT", "external_id": "wp-1482", "event": { "title": "Sunset Yoga", "start": "2026-11-12T18:00:00" } }, { "method": "PUT", "external_id": "wp-1490", "event": { "title": "", "start": "2026-11-13T18:00:00" } }, { "method": "DELETE", "external_id": "wp-1311" } ] }' ``` | Feld | Regeln | | -------------------------- | ---------------------------------------------------------------------- | | `operations` | 1 bis 100 Einträge | | `operations[].method` | `PUT` (anlegen oder ändern) oder `DELETE` | | `operations[].external_id` | wie beim [Einzel-PUT](/api/events/) | | `operations[].event` | bei `PUT`: der Termin mit denselben Feldern wie beim Einzel-PUT | | `sync_id` | optional: ordnet die Operationen einem [Full Sync](/api/full-sync/) zu | Der Request-Body darf bis zu 1 MB groß sein. ## Antwort [Abschnitt betitelt „Antwort“](#antwort) Immer `200 OK`, sofern der Aufruf selbst gültig ist. Das Ergebnis jeder Operation steht in `results`, in derselben Reihenfolge: ```json { "results": [ { "external_id": "wp-1482", "status": 201, "changed": true, "sequence": 0 }, { "external_id": "wp-1490", "status": 400, "error": { "code": "invalid_request", "errors": [{ "field": "title", "code": "too_small", "message": "String must contain at least 1 character(s)" }] } }, { "external_id": "wp-1311", "status": 204 } ] } ``` | `status` | Bedeutung | | -------- | ------------------------------------------------------------------------------------- | | `201` | Termin angelegt | | `200` | Termin geändert oder unverändert (`changed: false`) | | `204` | Termin gelöscht (oder war schon weg) | | `4xx` | Fehler bei dieser Operation, Details in `error.code`, `error.message`, `error.errors` | Mögliche Fehlercodes je Operation: [`invalid_request`](/api/errors/invalid_request/), [`invalid_external_id`](/api/errors/invalid_external_id/), [`event_limit_reached`](/api/errors/event_limit_reached/). ## Verhalten [Abschnitt betitelt „Verhalten“](#verhalten) * Die Operationen laufen **der Reihe nach**. Eine fehlerhafte Operation hält die anderen nicht auf; prüfe also jedes Ergebnis. * Ein Batch ist **keine Transaktion**. Bricht die Verbindung ab, sind manche Operationen eventuell schon durch. Schick den Batch einfach noch einmal: `PUT` und `DELETE` sind idempotent. * Der Feed wird nach dem Batch einmal aktualisiert, nicht pro Operation. * Jeder Batch zählt als **eine** Anfrage für das [Rate Limit](/api/limits/). Für Importe ist Batch deshalb der richtige Weg. Fehler, die den ganzen Aufruf betreffen (Key, Kalender, mehr als 100 Operationen, Body zu groß, Sync abgelaufen), kommen wie gewohnt als Problem-Antwort mit HTTP-Status. → [Fehler](/api/errors/) # Button und ks:subscribe > Den Abo-Button einbetten, Klicks über das Event ks:subscribe im eigenen Analytics erfassen und Buttons in Page-Buildern und SPAs nachladen. Der Button ist der einfachste Weg, Besucher deiner Website zu Abonnenten zu machen. Er braucht keinen API-Key, nur die Kalender-ID. ```html
``` Live-Vorschau Farbe#0f766eButton-TextKalender abonnierenSpracheSeitensprache Button wird geladen… Snippet für deine WebsiteKopieren ``` ``` Ersetze cal\_XXXXXXXXXXXX durch die ID deines Kalenders. [Demo-Abo-Seite öffnen](https://app.kalender-sync.de/subscribe/cal_N89Q5UXumKb4) ## Attribute [Abschnitt betitelt „Attribute“](#attribute) | Attribut | Wirkung | Standard | | --------------- | ------------------------------------------------------------------------------------ | ----------------------------------------------------- | | `data-calendar` | Kalender-ID (`cal_` plus 12 Zeichen). Pflicht; ohne gültige ID rendert nichts. | | | `data-color` | Hex-Farbe `#rrggbb`. Die Textfarbe wählt der Button selbst für ausreichend Kontrast. | `#2563eb` | | `data-label` | Eigener Button-Text | „Kalender abonnieren“ / „Subscribe to calendar“ | | `data-lang` | `de` oder `en` | `lang` der Seite, dann Browsersprache, sonst Englisch | Das Script brauchst du einmal pro Seite. Es rendert jedes Element mit der Klasse `ks-subscribe` und einem `data-calendar`. ## Wie der Button funktioniert [Abschnitt betitelt „Wie der Button funktioniert“](#wie-der-button-funktioniert) * Er rendert in ein **Shadow DOM**. Das CSS deiner Seite greift nicht hinein, und sein CSS nicht hinaus. * Er setzt **keine Cookies**, speichert nichts und lädt nichts außer dem Script selbst. * Die Menüeinträge sind normale Links auf `https://app.kalender-sync.de/api/public/subscribe/{calendar_id}/go/{app}`. Erst dieser Aufruf legt das Abo an und leitet zur Kalender-App weiter. Deine Seite schickt also keine Anfragen per JavaScript an uns, und du brauchst kein CORS. * Apps im Menü: Apple Kalender, Google Kalender, Microsoft 365, Outlook.com, Outlook (Desktop) und „Andere App“, das die Abo-Seite mit dem Feed-Link öffnet. Die passende App für das Gerät steht oben. * Escape schließt das Menü, ein Klick daneben auch. ## Das Event `ks:subscribe` [Abschnitt betitelt „Das Event ks:subscribe“](#das-event-kssubscribe) Wir tracken keine Besucher. Damit du trotzdem weißt, wie dein Button genutzt wird, feuert er bei jedem Klick auf einen Menüeintrag das Event **`ks:subscribe`**. Es bubbelt aus dem Shadow DOM heraus (`composed: true`), du kannst es also am Element oder am `document` abgreifen. ```js document.addEventListener('ks:subscribe', (event) => { // event.detail = { calendar: 'cal_XXXXXXXXXXXX', app: 'google' } const { calendar, app } = event.detail; // Beispiel: an dein eigenes Analytics weitergeben, unter deiner Einwilligung window.plausible?.('Calendar subscribe', { props: { calendar, app } }); }); ``` `app` ist einer dieser Werte: `apple`, `google`, `office365`, `outlook`, `outlook_desktop`, `other`. Das Event läuft komplett auf deiner Seite. Ob und wie du es auswertest, entscheidest du, ebenso über die Einwilligung dafür. ## Seiten, die später rendern [Abschnitt betitelt „Seiten, die später rendern“](#seiten-die-später-rendern) Page-Builder (Elementor, Divi …) und Single-Page-Apps (React, Vue …) fügen Inhalte oft erst ein, nachdem das Script gelaufen ist. Ruf dann nach dem Einfügen auf: ```js window.KalenderSync?.mountButtons(); ``` Bereits gerenderte Buttons bleiben dabei unverändert. Willst du einen Button mit anderen Attributen neu rendern, ersetze das Element durch ein neues und ruf `mountButtons()` erneut auf. Beispiel für React: ```jsx useEffect(() => { window.KalenderSync?.mountButtons(); }, []); return
; ``` ## Eigene Buttons statt des Scripts [Abschnitt betitelt „Eigene Buttons statt des Scripts“](#eigene-buttons-statt-des-scripts) Willst du kein Script einbinden, verlinke die `subscribe_page_url` des Kalenders mit einem eigenen Button. Abos über die Abo-Seite werden genauso gezählt. Die `subscribe_links` aus der [Kalender-Antwort](/api/calendars/#die-antwort) funktionieren auch, werden aber in der [Statistik](/api/stats/) nicht gezählt. ## Content-Security-Policy [Abschnitt betitelt „Content-Security-Policy“](#content-security-policy) Setzt deine Website eine CSP, ergänze in den bestehenden Direktiven: ```plaintext script-src https://app.kalender-sync.de; style-src 'unsafe-inline'; img-src data:; ``` `style-src` und `img-src` brauchst du nur, wenn deine CSP diese Direktiven überhaupt einschränkt: Der Button bringt Inline-Styles im Shadow DOM mit, und das Microsoft-Icon ist als `data:`-Bild eingebettet. `connect-src` und `frame-src` sind nicht nötig. # Kalender > Abo-Kalender per API anlegen, auflisten, ändern und löschen. Alle Felder mit Grenzen und Standardwerten, Feed-URL und Abo-Links in der Antwort. 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. ## Felder [Abschnitt betitelt „Felder“](#felder) | Feld | Typ | Regeln | Standard | | ------------------ | ------------------ | ------------------------------------------------------------------------------------------------------------------ | -------- | | `name` | String | Pflicht beim Anlegen, 1 bis 100 Zeichen | | | `timezone` | String | Pflicht beim Anlegen, IANA-Name wie `Europe/Berlin` | | | `description` | String oder `null` | bis 1.000 Zeichen | `null` | | `site_url` | String oder `null` | `https://`-URL, bis 2.000 Zeichen | `null` | | `language` | `de` oder `en` | Sprache der Abo-Seite | `en` | | `default_duration` | String | ISO-8601-Dauer bis `PT24H`, z. B. `PT1H`, `PT90M`, `PT1H30M`. Gilt für Termine ohne `end`. | `PT1H` | | `brand_color` | String oder `null` | Hex-Farbe `#rrggbb`, wird kleingeschrieben gespeichert | `null` | | `organizer` | Objekt oder `null` | `name` (Pflicht, bis 100 Zeichen), `url` (`https://`, optional), `email` (optional). Öffentlich auf der Abo-Seite. | `null` | | `show_events` | Boolean | Kommende Termine auf der Abo-Seite zeigen | `true` | Unbekannte Felder werden mit `400 invalid_request` abgelehnt. ## Kalender anlegen [Abschnitt betitelt „Kalender anlegen“](#kalender-anlegen) ```bash 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](/api/idempotency/) Mögliche Fehler: [`calendar_limit_reached`](/api/errors/calendar_limit_reached/) (Limit deines Tarifs bzw. 3 Testkalender), [`plan_required`](/api/errors/plan_required/) (Live-Kalender im Free-Tarif), [`insufficient_scope`](/api/errors/insufficient_scope/) (Key ist auf bestimmte Kalender beschränkt). ## Die Antwort [Abschnitt betitelt „Die Antwort“](#die-antwort) Alle Kalender-Endpunkte liefern dieselbe Form: ```json { "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" } ``` | Feld | Bedeutung | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- | | `subscribe_page_url` | Die gehostete [Abo-Seite](/abo-kalender/abo-seite/). Am besten verlinkst du diese oder baust den [Button](/api/button/) ein. | | `feed_url` | Der allgemeine ICS-Feed. Er ändert sich nie, solange der Kalender besteht. | | `subscribe_links` | Direkte Abo-Links je App. Funktionieren, werden aber in der [Statistik](/api/stats/) nicht gezählt. Abo-Seite und Button zählen. | | `logo_url`, `banner_url` | Öffentliche Bild-URLs oder `null`. → [Bilder](/api/images/) | | `event_count` | Anzahl gespeicherter Termine; eine Serie zählt als einer. | | `blocked` | `true`, wenn wir den Kalender wegen eines Verstoßes gegen unsere Bedingungen gesperrt haben. → [`calendar_blocked`](/api/errors/calendar_blocked/) | URLs speichern wir in normalisierter Form, daher kann zum Beispiel ein abschließender Schrägstrich dazukommen. ## Kalender auflisten und lesen [Abschnitt betitelt „Kalender auflisten und lesen“](#kalender-auflisten-und-lesen) ```bash 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. ## Kalender ändern [Abschnitt betitelt „Kalender ändern“](#kalender-ändern) `PATCH` ändert nur die Felder, die du mitschickst. `null` leert ein Feld, das `null` erlaubt (zum Beispiel `"organizer": null`). ```bash 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. ## Kalender löschen [Abschnitt betitelt „Kalender löschen“](#kalender-löschen) ```bash 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. # Fehler > Alle Fehler der Publisher API als application/problem+json (RFC 9457) mit stabilem code, request_id und Feldfehlern. Liste aller Codes mit Erklärung. Jeder Fehler der Publisher API kommt im selben Format: `application/problem+json` nach RFC 9457. ```json { "type": "https://docs.kalender-sync.de/en/api/errors/invalid_request", "title": "The request is invalid", "status": 400, "code": "invalid_request", "request_id": "req_…", "errors": [ { "field": "end", "code": "end_before_start", "message": "end must not be before start." } ] } ``` | Feld | Bedeutung | | ------------ | ------------------------------------------------------------------------------------------ | | `type` | Link auf die Erklärung des Fehlers in dieser Doku (englische Fassung). | | `title` | Kurze Beschreibung des HTTP-Status. | | `status` | HTTP-Status, wie in der Antwort. | | `code` | **Stabiler, maschinenlesbarer Fehlercode.** Werte diesen aus, nicht `title` oder `detail`. | | `detail` | Optional: Erklärung für Menschen, kann sich ändern. | | `request_id` | Eindeutige ID der Anfrage. Nenne sie, wenn du dich an den Support wendest. | | `errors` | Nur bei `invalid_request`: alle Feldfehler mit `field`, `code` und `message`. | Neue Fehlercodes können dazukommen. Behandle unbekannte Codes nach ihrem HTTP-Status: `4xx` heißt „Anfrage korrigieren“, `429` und `5xx` heißt „später wiederholen“. ## Alle Fehlercodes [Abschnitt betitelt „Alle Fehlercodes“](#alle-fehlercodes) | Code | Status | Bedeutung | | ----------------------------------------------------------------- | ------ | ------------------------------------------------------------------ | | [`missing_api_key`](/api/errors/missing_api_key/) | 401 | Kein API-Key in der Anfrage. | | [`invalid_api_key`](/api/errors/invalid_api_key/) | 401 | Der API-Key ist ungültig, widerrufen oder abgelaufen. | | [`insufficient_scope`](/api/errors/insufficient_scope/) | 403 | Dem Key fehlt die nötige Berechtigung. | | [`plan_required`](/api/errors/plan_required/) | 403 | Für diesen Live-Kalender reicht der Tarif nicht. | | [`calendar_blocked`](/api/errors/calendar_blocked/) | 403 | Wir haben diesen Kalender gesperrt. | | [`terms_required`](/api/errors/terms_required/) | 403 | Für Live-Kalender fehlt deine Zustimmung zu den Zusatzbedingungen. | | [`invalid_request`](/api/errors/invalid_request/) | 400 | Die Anfrage ist ungültig. | | [`invalid_external_id`](/api/errors/invalid_external_id/) | 400 | Die external\_id einer Batch-Operation ist ungültig. | | [`invalid_cursor`](/api/errors/invalid_cursor/) | 400 | Der Cursor zum Blättern ist ungültig. | | [`invalid_idempotency_key`](/api/errors/invalid_idempotency_key/) | 400 | Der Idempotency-Key ist zu lang. | | [`idempotency_key_reused`](/api/errors/idempotency_key_reused/) | 409 | Der Idempotency-Key wurde für eine andere Anfrage benutzt. | | [`idempotency_in_progress`](/api/errors/idempotency_in_progress/) | 409 | Die erste Anfrage mit diesem Idempotency-Key läuft noch. | | [`not_found`](/api/errors/not_found/) | 404 | Diesen Endpunkt gibt es nicht. | | [`calendar_not_found`](/api/errors/calendar_not_found/) | 404 | Kein Kalender mit dieser ID für diesen Key. | | [`event_not_found`](/api/errors/event_not_found/) | 404 | Kein Termin mit dieser external\_id in diesem Kalender. | | [`sync_not_found`](/api/errors/sync_not_found/) | 404 | Kein Full Sync mit dieser ID für diesen Kalender. | | [`sync_expired`](/api/errors/sync_expired/) | 409 | Der Full Sync ist abgelaufen. | | [`sync_completed`](/api/errors/sync_completed/) | 409 | Der Full Sync ist schon abgeschlossen. | | [`calendar_limit_reached`](/api/errors/calendar_limit_reached/) | 409 | Das Konto hat schon so viele Kalender, wie erlaubt sind. | | [`event_limit_reached`](/api/errors/event_limit_reached/) | 409 | Der Kalender hat die maximale Zahl an Terminen. | | [`sequence_mismatch`](/api/errors/sequence_mismatch/) | 409 | Der Termin hat sich seit der übergebenen Sequence geändert. | | [`large_delete`](/api/errors/large_delete/) | 409 | Der Full Sync würde mehr als die Hälfte der Termine löschen. | | [`invalid_image`](/api/errors/invalid_image/) | 400 | Kein Bild im Request-Body. | | [`image_too_large`](/api/errors/image_too_large/) | 413 | Das Bild ist zu groß. | | [`unsupported_image_type`](/api/errors/unsupported_image_type/) | 415 | Das Bild ist kein PNG, JPEG oder WebP. | | [`payload_too_large`](/api/errors/payload_too_large/) | 413 | Der Request-Body ist zu groß. | | [`unsupported_media_type`](/api/errors/unsupported_media_type/) | 415 | Der Content-Type wird an diesem Endpunkt nicht angenommen. | | [`rate_limited`](/api/errors/rate_limited/) | 429 | Zu viele Anfragen. | | [`internal_error`](/api/errors/internal_error/) | 500 | Unerwarteter Fehler bei uns. | Feldfehler innerhalb von `invalid_request` (zum Beispiel `invalid_timezone` oder `unsupported_rrule`) stehen unter [Termine: Validierungsfehler](/api/events/#validierungsfehler). # calendar_blocked > 403 · Wir haben diesen Kalender gesperrt. **Wir haben diesen Kalender gesperrt.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `403` | | `code` | `calendar_blocked` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Der Kalender wurde wegen eines Verstoßes gegen unsere Bedingungen gesperrt. Er nimmt keine Änderungen mehr an, die Abo-Seite ist nicht erreichbar, und der Feed liefert einen leeren Kalender. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Schreib an und nenne die Kalender-ID und die `request_id`. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/calendar_blocked", "title": "The API key is not allowed to do this", "status": 403, "code": "calendar_blocked", "detail": "This calendar was blocked for a breach of our terms. Contact support@kalender-sync.de.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # calendar_limit_reached > 409 · Das Konto hat schon so viele Kalender, wie erlaubt sind. **Das Konto hat schon so viele Kalender, wie erlaubt sind.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `409` | | `code` | `calendar_limit_reached` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Sandbox: 3 Testkalender je Konto. Live: so viele, wie dein Tarif umfasst (Basic 1, Professional 10). Gelöschte Kalender zählen nicht mit. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Lösche einen Kalender, den du nicht mehr brauchst, oder wechsle in einen größeren Tarif. Für mehr als 10 Live-Kalender schreib uns. → [Tarife und Limits](/abo-kalender/tarife/) ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/calendar_limit_reached", "title": "Conflict", "status": 409, "code": "calendar_limit_reached", "detail": "This account can have 3 sandbox calendars.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # calendar_not_found > 404 · Kein Kalender mit dieser ID für diesen Key. **Kein Kalender mit dieser ID für diesen Key.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `404` | | `code` | `calendar_not_found` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Den Kalender gibt es nicht, er wurde gelöscht, er gehört zu einem anderen Konto, er ist im anderen Modus (Sandbox-Key und Live-Kalender oder umgekehrt), oder der Key ist auf andere Kalender beschränkt. Aus Datenschutzgründen unterscheidet die API diese Fälle nicht. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Prüfe die ID mit `GET /v1/publisher/calendars` und ob du den passenden Key nutzt: `ks_test_` für Testkalender, `ks_live_` für Live-Kalender. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/calendar_not_found", "title": "Not found", "status": 404, "code": "calendar_not_found", "detail": "No calendar with this id for this API key.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # event_limit_reached > 409 · Der Kalender hat die maximale Zahl an Terminen. **Der Kalender hat die maximale Zahl an Terminen.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `409` | | `code` | `event_limit_reached` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Ein Live-Kalender fasst 5.000 Termine, ein Testkalender 500. Eine Serie zählt als ein Termin. Der Fehler kommt nur beim Anlegen neuer Termine; bestehende kannst du weiter ändern. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Lösche vergangene oder nicht mehr benötigte Termine, fasse regelmäßige Termine zu Serien zusammen, oder verteile die Termine auf mehrere Kalender. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/event_limit_reached", "title": "Conflict", "status": 409, "code": "event_limit_reached", "detail": "A calendar can hold 5000 events; a series counts as one.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # event_not_found > 404 · Kein Termin mit dieser external_id in diesem Kalender. **Kein Termin mit dieser external\_id in diesem Kalender.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `404` | | `code` | `event_not_found` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Kommt nur beim Lesen eines einzelnen Termins vor. `DELETE` antwortet auch für nicht vorhandene Termine mit `204`. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Prüfe die `external_id` (Groß- und Kleinschreibung zählt) und den Kalender. Mit `PUT` legst du den Termin an. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/event_not_found", "title": "Not found", "status": 404, "code": "event_not_found", "detail": "No event with this external_id in this calendar.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # idempotency_in_progress > 409 · Die erste Anfrage mit diesem Idempotency-Key läuft noch. **Die erste Anfrage mit diesem Idempotency-Key läuft noch.** | | | | ------------ | ------------------------- | | HTTP-Status | `409` | | `code` | `idempotency_in_progress` | | Wiederholen? | Ja, nach einer Wartezeit | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Du hast eine Anfrage wiederholt, während die erste noch verarbeitet wird. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Warte einen Moment und wiederhole die Anfrage. Ist die erste fertig, bekommst du ihre Antwort mit dem Header `Idempotent-Replayed: true`. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/idempotency_in_progress", "title": "Conflict", "status": 409, "code": "idempotency_in_progress", "detail": "A request with this Idempotency-Key is still running.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # idempotency_key_reused > 409 · Der Idempotency-Key wurde für eine andere Anfrage benutzt. **Der Idempotency-Key wurde für eine andere Anfrage benutzt.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `409` | | `code` | `idempotency_key_reused` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Innerhalb der letzten 24 Stunden kam mit diesem API-Key schon eine Anfrage mit demselben `Idempotency-Key`, aber mit anderem Pfad oder Body. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Erzeuge für jede neue Anfrage einen neuen Key. Denselben Key nur für die exakte Wiederholung derselben Anfrage verwenden. → [Idempotenz](/api/idempotency/) ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/idempotency_key_reused", "title": "Conflict", "status": 409, "code": "idempotency_key_reused", "detail": "This Idempotency-Key was used for a different request.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # image_too_large > 413 · Das Bild ist zu groß. **Das Bild ist zu groß.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `413` | | `code` | `image_too_large` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Ein Logo darf bis 512 KB groß sein, ein Banner bis 2 MB. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Verkleinere oder komprimiere das Bild, zum Beispiel als WebP. Für das Logo reichen 192 bis 512 px. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/image_too_large", "title": "The request body is too large", "status": 413, "code": "image_too_large", "detail": "The logo may be up to 512 KB.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # insufficient_scope > 403 · Dem Key fehlt die nötige Berechtigung. **Dem Key fehlt die nötige Berechtigung.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `403` | | `code` | `insufficient_scope` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Der Key hat den benötigten Scope nicht (`publisher:read`, `publisher:write` oder `publisher:stats`), oder er ist auf bestimmte Kalender beschränkt und versucht, einen neuen Kalender anzulegen. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Keys aus **Einstellungen › Entwickler / API** haben alle drei Scopes. Prüfe mit `GET /v1/me`, welche Scopes und Kalender dein Key hat, und nutze gegebenenfalls einen anderen Key. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/insufficient_scope", "title": "The API key is not allowed to do this", "status": 403, "code": "insufficient_scope", "detail": "This key lacks the publisher:write scope.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # internal_error > 500 · Unerwarteter Fehler bei uns. **Unerwarteter Fehler bei uns.** | | | | ------------ | ------------------------ | | HTTP-Status | `500` | | `code` | `internal_error` | | Wiederholen? | Ja, nach einer Wartezeit | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Bei uns ist etwas schiefgegangen. Das liegt nicht an deiner Anfrage. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Wiederhole die Anfrage mit wachsendem Abstand (zum Beispiel nach 1, 5 und 30 Sekunden). `PUT` und `DELETE` sind dafür sicher. Bleibt der Fehler, schreib an mit der `request_id`. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/internal_error", "title": "Internal error", "status": 500, "code": "internal_error", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # invalid_api_key > 401 · Der API-Key ist ungültig, widerrufen oder abgelaufen. **Der API-Key ist ungültig, widerrufen oder abgelaufen.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `401` | | `code` | `invalid_api_key` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Der Key hat nicht das richtige Format, die Prüfsumme am Ende stimmt nicht, oder es gibt ihn nicht (mehr), etwa weil er widerrufen wurde. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Kopiere den Key noch einmal vollständig, ohne Leerzeichen oder Zeilenumbruch. Ist er verloren oder widerrufen, leg unter **Einstellungen › Entwickler / API** einen neuen an. Zugangsschlüssel für den MCP-Server (`ksa_…`) funktionieren hier nicht. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/invalid_api_key", "title": "Missing or invalid API key", "status": 401, "code": "invalid_api_key", "detail": "The API key is not valid. It may have been revoked or mistyped.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # invalid_cursor > 400 · Der Cursor zum Blättern ist ungültig. **Der Cursor zum Blättern ist ungültig.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `400` | | `code` | `invalid_cursor` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Der `cursor`-Parameter beim Auflisten von Terminen ist kein Wert, den die API ausgegeben hat, oder er wurde beim Kopieren verändert. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Übernimm `next_cursor` unverändert aus der vorigen Antwort (URL-kodiert). Im Zweifel beginne ohne `cursor` von vorn. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/invalid_cursor", "title": "The request is invalid", "status": 400, "code": "invalid_cursor", "detail": "The cursor is not valid. Start again without it.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # invalid_external_id > 400 · Die external_id einer Batch-Operation ist ungültig. **Die external\_id einer Batch-Operation ist ungültig.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `400` | | `code` | `invalid_external_id` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Kommt nur als Ergebnis einer einzelnen Operation im [Batch](/api/batch/) vor, nicht als Antwort auf den ganzen Aufruf. Die `external_id` muss 1 bis 128 Zeichen lang sein und darf nur Buchstaben, Ziffern und `.` `_` `:` `-` enthalten. Beim Einzel-PUT führt eine ungültige ID zu `invalid_request`. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Bilde die ID aus erlaubten Zeichen, zum Beispiel `wp-1482` statt `wp 1482` oder `wp/1482`. ## Beispiel (Ergebnis im Batch) [Abschnitt betitelt „Beispiel (Ergebnis im Batch)“](#beispiel-ergebnis-im-batch) ```json { "results": [ { "external_id": "wp 1482", "status": 400, "error": { "code": "invalid_external_id" } } ] } ``` → [Alle Fehlercodes](/api/errors/) # invalid_idempotency_key > 400 · Der Idempotency-Key ist zu lang. **Der Idempotency-Key ist zu lang.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `400` | | `code` | `invalid_idempotency_key` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Der Header `Idempotency-Key` darf höchstens 255 Zeichen lang sein. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Nimm eine UUID oder einen anderen kurzen, eindeutigen Wert. → [Idempotenz](/api/idempotency/) ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/invalid_idempotency_key", "title": "The request is invalid", "status": 400, "code": "invalid_idempotency_key", "detail": "Idempotency-Key may be up to 255 characters.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # invalid_image > 400 · Kein Bild im Request-Body. **Kein Bild im Request-Body.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `400` | | `code` | `invalid_image` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Der Body beim Hochladen von Logo oder Banner ist leer. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Schick das Bild selbst als Body, mit curl zum Beispiel `--data-binary @logo.png` (nicht `-d` und nicht als Formular). → [Bilder](/api/images/) ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/invalid_image", "title": "The request is invalid", "status": 400, "code": "invalid_image", "detail": "Send the image as the request body with Content-Type image/png, image/jpeg or image/webp.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # invalid_request > 400 · Die Anfrage ist ungültig. **Die Anfrage ist ungültig.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `400` | | `code` | `invalid_request` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Der Body oder ein Parameter passt nicht zum Schema: Pflichtfeld fehlt, unbekanntes Feld, falscher Typ, zu langer Text, ungültige Zeit oder Regel. Auch kaputtes JSON landet hier. In `errors` stehen **alle** Probleme auf einmal, jeweils mit `field`, `code` und `message`. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Lies `errors[].field` und `errors[].code`. Fachliche Codes wie `invalid_timezone`, `end_before_start` oder `unsupported_rrule` sind unter [Termine: Validierungsfehler](/api/events/#validierungsfehler) erklärt. Schemaverstöße tragen den Code des Validators, zum Beispiel `invalid_type`, `too_big` oder `unrecognized_keys` (unbekanntes Feld, oft ein Tippfehler). ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/invalid_request", "title": "The request is invalid", "status": 400, "code": "invalid_request", "request_id": "req_…", "errors": [ { "field": "end", "code": "end_before_start", "message": "end must not be before start." }, { "field": "recurrence.rules[0]", "code": "unsupported_rrule", "message": "BYHOUR is not supported." } ] } ``` → [Alle Fehlercodes](/api/errors/) # large_delete > 409 · Der Full Sync würde mehr als die Hälfte der Termine löschen. **Der Full Sync würde mehr als die Hälfte der Termine löschen.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `409` | | `code` | `large_delete` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Beim Abschließen eines Full Syncs werden alle Termine gelöscht, die nicht mitgeschickt wurden. Wären das mehr als 50 %, bricht die API zur Sicherheit ab. Es wurde nichts gelöscht, der Sync bleibt offen. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Prüfe, ob dein Export vollständig war. Wenn ja und das Löschen gewollt ist, ruf `complete` erneut mit `{ "confirm_large_delete": true }` auf. → [Full Sync](/api/full-sync/) ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/large_delete", "title": "Conflict", "status": 409, "code": "large_delete", "detail": "Completing this sync would remove 120 of 200 events. Send \"confirm_large_delete\": true if that is intended.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # missing_api_key > 401 · Kein API-Key in der Anfrage. **Kein API-Key in der Anfrage.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `401` | | `code` | `missing_api_key` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Die Anfrage hat keinen Header `Authorization: Bearer …`, oder der Header hat nicht die Form `Bearer `. Auch ein unbekannter Pfad unter `/v1` antwortet ohne Key mit diesem Fehler statt mit `404`, damit die API nicht verrät, welche Pfade es gibt. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Schick den Key als `Authorization: Bearer ks_live_…` bzw. `ks_test_…`. Prüfe, ob ein Proxy oder dein HTTP-Client den Header entfernt. Keys legst du unter **Einstellungen › Entwickler / API** an. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/missing_api_key", "title": "Missing or invalid API key", "status": 401, "code": "missing_api_key", "detail": "Send the API key as \"Authorization: Bearer \".", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # not_found > 404 · Diesen Endpunkt gibt es nicht. **Diesen Endpunkt gibt es nicht.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `404` | | `code` | `not_found` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Pfad oder Methode existieren unter `/v1` nicht. Diesen Fehler siehst du nur mit gültigem Key; ohne Key antwortet die API mit `401 missing_api_key`. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Prüfe Pfad, Methode und Basis-URL (`https://api.kalender-sync.de/v1`). Alle Endpunkte stehen in der [OpenAPI-Datei](https://api.kalender-sync.de/v1/openapi.json). ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/not_found", "title": "Not found", "status": 404, "code": "not_found", "detail": "No such endpoint.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # payload_too_large > 413 · Der Request-Body ist zu groß. **Der Request-Body ist zu groß.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `413` | | `code` | `payload_too_large` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) JSON-Bodies dürfen bis 1 MB groß sein (auch beim Batch), Bild-Uploads etwas über 2 MB. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Teile große Batches auf, kürze lange Beschreibungen, oder verkleinere das Bild. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/payload_too_large", "title": "The request body is too large", "status": 413, "code": "payload_too_large", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # plan_required > 403 · Für diesen Live-Kalender reicht der Tarif nicht. **Für diesen Live-Kalender reicht der Tarif nicht.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `403` | | `code` | `plan_required` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Entweder versuchst du im Free-Tarif einen Live-Kalender anzulegen, oder dein Konto hat mehr Live-Kalender, als der Tarif umfasst (zum Beispiel nach einem Downgrade oder nach dem Test-Zeitraum). Im zweiten Fall laufen Feeds und Abo-Seiten weiter, nur Schreibzugriffe werden abgelehnt. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Teste mit einem Sandbox-Key (`ks_test_`), wechsle in einen größeren Tarif, oder lösche einen Live-Kalender. Sandbox-Kalender sind davon nie betroffen. → [Tarife und Limits](/abo-kalender/tarife/) ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/plan_required", "title": "The API key is not allowed to do this", "status": 403, "code": "plan_required", "detail": "Live calendars need the Basic or Professional plan. The calendar stays subscribable; writes resume after an upgrade.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # rate_limited > 429 · Zu viele Anfragen. **Zu viele Anfragen.** | | | | ------------ | ------------------------ | | HTTP-Status | `429` | | `code` | `rate_limited` | | Wiederholen? | Ja, nach einer Wartezeit | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Der Key hat mehr als 120 Anfragen in einem Fenster von 60 Sekunden geschickt, oder von deiner IP-Adresse kamen mehr als 600 Anfragen pro Minute. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Warte so viele Sekunden, wie der Header `Retry-After` angibt, und wiederhole dann. Nutze für viele Termine den [Batch](/api/batch/) (100 Operationen zählen als eine Anfrage). → [Limits](/api/limits/) ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/rate_limited", "title": "Too many requests", "status": 429, "code": "rate_limited", "detail": "This key may send 120 requests per 60 seconds.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # sequence_mismatch > 409 · Der Termin hat sich seit der übergebenen Sequence geändert. **Der Termin hat sich seit der übergebenen Sequence geändert.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `409` | | `code` | `sequence_mismatch` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Du hast `If-Match` mit einer `sequence` geschickt, aber der Termin hat inzwischen eine andere, oder es gibt ihn noch gar nicht. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Lies den Termin neu (`GET`), führe die Änderungen zusammen und schreib mit der aktuellen `sequence`. Brauchst du keinen Schutz vor parallelen Änderungen, lass `If-Match` weg. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/sequence_mismatch", "title": "Conflict", "status": 409, "code": "sequence_mismatch", "detail": "The event changed since the sequence you sent.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # sync_completed > 409 · Der Full Sync ist schon abgeschlossen. **Der Full Sync ist schon abgeschlossen.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `409` | | `code` | `sync_completed` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Du hast einen Batch mit einer `sync_id` geschickt oder `complete` aufgerufen, nachdem der Sync bereits abgeschlossen war. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Für einen neuen Abgleich einen neuen Sync starten. Ein doppeltes `complete` nach einem Netzwerkfehler kannst du ignorieren: Der erste Aufruf war erfolgreich. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/sync_completed", "title": "Conflict", "status": 409, "code": "sync_completed", "detail": "This sync is already complete.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # sync_expired > 409 · Der Full Sync ist abgelaufen. **Der Full Sync ist abgelaufen.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `409` | | `code` | `sync_expired` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Ein Full Sync ist eine Stunde gültig. Danach nimmt er keine Batches mehr an und lässt sich nicht abschließen. Gelöscht wurde dabei nichts. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Starte einen neuen Sync und schick alle Termine erneut. Bei sehr vielen Terminen: Batches mit 100 Operationen nutzen und das [Rate Limit](/api/limits/) im Blick behalten. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/sync_expired", "title": "Conflict", "status": 409, "code": "sync_expired", "detail": "This sync expired after one hour. Start a new one.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # sync_not_found > 404 · Kein Full Sync mit dieser ID für diesen Kalender. **Kein Full Sync mit dieser ID für diesen Kalender.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `404` | | `code` | `sync_not_found` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Die `sync_id` existiert nicht oder gehört zu einem anderen Kalender. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Nutze die `sync_id` aus `POST …/syncs` für denselben Kalender. → [Full Sync](/api/full-sync/) ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/sync_not_found", "title": "Not found", "status": 404, "code": "sync_not_found", "detail": "No sync with this id for this calendar.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # terms_required > 403 · Für Live-Kalender fehlt deine Zustimmung zu den Zusatzbedingungen. **Für Live-Kalender fehlt deine Zustimmung zu den Zusatzbedingungen.** | | | | ------------ | -------------------- | | HTTP-Status | `403` | | `code` | `terms_required` | | Wiederholen? | Nein, erst zustimmen | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Bevor dein Konto den ersten Live-Kalender anlegt, stimmst du einmal den [Zusatzbedingungen für Abo-Kalender](https://kalender-sync.de/agb/#abo-kalender) (AGB Ziffer 14) und der [AVV-Ergänzung](https://kalender-sync.de/avv/) (Ziffer 17) zu. Das gilt für die API und für KI-Assistenten über MCP gleichermaßen. Sandbox-Kalender brauchen keine Zustimmung. In den Einstellungen der App heißt derselbe Fall `TERMS_REQUIRED`: Ohne Haken lässt sich kein Live-Key erstellen. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Öffne in der App **Einstellungen › Entwickler / API**, setze den Haken bei den Zusatzbedingungen und erstelle dann den Live-Key. Der Link steht auch im Feld `detail`. Danach die Anfrage wiederholen. → [Tarife und Limits](/abo-kalender/tarife/) ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/terms_required", "title": "The API key is not allowed to do this", "status": 403, "code": "terms_required", "detail": "Live calendars need consent to the subscribe-calendar terms (AGB section 14) and the AVV addendum (section 17). Accept them once in Kalender Sync under Settings › Developer / API: https://app.kalender-sync.de/settings/api", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # unsupported_image_type > 415 · Das Bild ist kein PNG, JPEG oder WebP. **Das Bild ist kein PNG, JPEG oder WebP.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `415` | | `code` | `unsupported_image_type` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) Wir prüfen das Format am Inhalt der Datei, nicht am Content-Type. SVG, GIF, HEIC und andere Formate werden abgelehnt. SVG kann Skripte enthalten. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Konvertiere das Bild in PNG, JPEG oder WebP. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/unsupported_image_type", "title": "Unsupported media type", "status": 415, "code": "unsupported_image_type", "detail": "Use PNG, JPEG or WebP. SVG is not accepted.", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # unsupported_media_type > 415 · Der Content-Type wird an diesem Endpunkt nicht angenommen. **Der Content-Type wird an diesem Endpunkt nicht angenommen.** | | | | ------------ | ---------------------------------- | | HTTP-Status | `415` | | `code` | `unsupported_media_type` | | Wiederholen? | Nein, erst die Anfrage korrigieren | ## Was das bedeutet [Abschnitt betitelt „Was das bedeutet“](#was-das-bedeutet) JSON-Endpunkte erwarten `Content-Type: application/json`. Bild-Uploads erwarten `image/png`, `image/jpeg`, `image/webp` oder `application/octet-stream`. ## So behebst du es [Abschnitt betitelt „So behebst du es“](#so-behebst-du-es) Setze den passenden Header. Mit curl: `-H "Content-Type: application/json"` für JSON. ## Beispiel [Abschnitt betitelt „Beispiel“](#beispiel) ```json { "type": "https://docs.kalender-sync.de/en/api/errors/unsupported_media_type", "title": "Unsupported media type", "status": 415, "code": "unsupported_media_type", "request_id": "req_…" } ``` → [Alle Fehlercodes](/api/errors/) # Termine und Wiederholungen > Termine per PUT unter deiner eigenen ID schreiben. Alle Felder, Zeiten und Zeitzonen, ganztägige Termine, RRULE-Serien, Ausnahmen, geänderte Einzeltermine und Mapping-Beispiele für typische Plugin-Felder. Ein Termin ist ein einzelner Termin oder eine ganze Serie. Du adressierst ihn mit deiner eigenen **`external_id`**, zum Beispiel der Post-ID aus WordPress. Eine ID von uns musst du nicht speichern. ## Termin anlegen oder ändern [Abschnitt betitelt „Termin anlegen oder ändern“](#termin-anlegen-oder-ändern) ```plaintext PUT /v1/publisher/calendars/{calendar_id}/events/{external_id} ``` ```bash curl -X PUT https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/events/wp-1482 \ -H "Authorization: Bearer $KS_KEY" \ -H "Content-Type: application/json" \ -d '{ "title": "Sunset Yoga im Park", "description": "

Bring eine Matte mit. Für Mitglieder kostenlos.

", "location": "Riverside Park, Steg 2, Berlin", "url": "https://example.org/kurse/sunset-yoga/", "start": "2026-11-12T18:00:00", "end": "2026-11-12T19:30:00", "timezone": "Europe/Berlin", "status": "confirmed", "categories": ["Outdoor"], "metadata": { "post_id": 1482 } }' ``` `external_id` darf 1 bis 128 Zeichen lang sein: Buchstaben, Ziffern und `.` `_` `:` `-`. Bewährt hat sich ein Präfix, etwa `wp-1482`. **Antwort:** `201 Created` beim ersten Schreiben, `200 OK` bei einer Änderung. ```json { "external_id": "wp-1482", "calendar_id": "cal_XXXXXXXXXXXX", "sequence": 0, "created_at": "2026-11-03T14:05:40.000Z", "updated_at": "2026-11-03T14:05:40.000Z", "event": { "title": "Sunset Yoga im Park", "all_day": false, "start": "2026-11-12T18:00:00", "end": "2026-11-12T19:30:00", "timezone": "Europe/Berlin", "status": "confirmed", "show_as": "free", "categories": ["Outdoor"], "description": "Bring eine Matte mit. Für Mitglieder kostenlos.", "location": "Riverside Park, Steg 2, Berlin", "url": "https://example.org/kurse/sunset-yoga/", "metadata": { "post_id": 1482 } }, "changed": true } ``` * `event` ist der Termin so, wie wir ihn gespeichert haben: Zeiten als lokale Zeit in `timezone`, HTML als Text. * `sequence` zählt jede echte Änderung hoch. * Schickst du denselben Termin noch einmal, antwortet die API mit `200` und **`"changed": false`**. Es wird nichts geschrieben, der Feed bleibt unverändert. Du kannst also bei jedem Speichern in deinem System einfach `PUT` aufrufen. * `PUT` ersetzt den ganzen Termin. Felder, die du weglässt, sind danach leer bzw. auf dem Standardwert. ### Optimistisches Sperren mit `If-Match` [Abschnitt betitelt „Optimistisches Sperren mit If-Match“](#optimistisches-sperren-mit-if-match) Optional schickst du die zuletzt gesehene `sequence` mit: ```plaintext If-Match: "3" ``` Hat sich der Termin inzwischen geändert (oder gibt es ihn noch nicht), kommt `409` [`sequence_mismatch`](/api/errors/sequence_mismatch/) statt eines Überschreibens. ## Felder [Abschnitt betitelt „Felder“](#felder) | Feld | Regeln | Standard | | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | | `title` | Pflicht, 1 bis 255 Zeichen | | | `start` | Pflicht. Datum oder Datum mit Uhrzeit, siehe [Zeiten](#zeiten-und-zeitzonen) | | | `end` | optional. Bei Terminen mit Uhrzeit nicht vor `start`; bei ganztägigen Terminen **exklusiv** | `start` + `default_duration` des Kalenders bzw. ein Tag | | `timezone` | IANA-Name, z. B. `Europe/Berlin` | Zeitzone des Kalenders | | `all_day` | `true` oder `false` | `true`, wenn `start` ein reines Datum ist | | `description` | Text oder HTML, bis 65.536 Zeichen. HTML wird zu Text; Links bleiben als `Text (URL)` erhalten. Gespeichert werden höchstens 8.000 Zeichen. | | | `location` | bis 500 Zeichen | | | `url` | `https://`-URL, bis 2.000 Zeichen. Wird in Apps als Link gezeigt und zusätzlich an die Beschreibung angehängt. | | | `status` | `confirmed`, `tentative` oder `cancelled` | `confirmed` | | `show_as` | `free` oder `busy`: ob der Termin bei Abonnenten als belegt gilt | `free` | | `categories` | bis 10 Einträge à 1 bis 50 Zeichen | `[]` | | `recurrence` | Serie, siehe [Wiederholungen](#wiederholungen) | | | `metadata` | Beliebiges JSON-Objekt bis 2 KB. Kommt in API-Antworten zurück, erscheint aber nie im Feed oder auf der Abo-Seite. | | `show_as` steht standardmäßig auf `free`: Öffentliche Termine sollen den Kalender deiner Abonnenten nicht als belegt markieren. Ein abgesagter Termin (`"status": "cancelled"`) bleibt im Feed und ist dort als abgesagt markiert; wie das aussieht, hängt von der App ab. Soll er ganz verschwinden, lösche ihn. ## Zeiten und Zeitzonen [Abschnitt betitelt „Zeiten und Zeitzonen“](#zeiten-und-zeitzonen) | `start` / `end` | Bedeutung | | ----------------------------------------------------------- | ------------------------------------------------------------------------ | | `"2026-11-12T18:00:00"` | Lokale Zeit in `timezone` (bzw. der Zeitzone des Kalenders). Empfohlen. | | `"2026-11-12T17:00:00Z"` oder `"2026-11-12T18:00:00+01:00"` | Zeitpunkt mit Offset. Wird in `timezone` umgerechnet und so gespeichert. | | `"2026-11-12"` | Reines Datum: ganztägiger Termin. | Lokale Zeit plus IANA-Zeitzone ist der sicherste Weg: Sommer- und Winterzeit stimmen dann auch bei Serien über die Zeitumstellung hinweg. **Ganztägige Termine:** `end` ist exklusiv. Ein Termin nur am 12. November hat `"start": "2026-11-12"` und `"end": "2026-11-13"` oder gar kein `end`. Ein dreitägiges Festival vom 12. bis 14. November hat `"end": "2026-11-15"`. ## Wiederholungen [Abschnitt betitelt „Wiederholungen“](#wiederholungen) ```json { "title": "Morning Flow", "start": "2026-11-03T07:30:00", "end": "2026-11-03T08:30:00", "timezone": "Europe/Berlin", "recurrence": { "rules": ["FREQ=WEEKLY;BYDAY=TU;UNTIL=20270330"], "except_dates": ["2026-12-22", "2026-12-29"], "overrides": [ { "original_start": "2026-11-17T07:30:00", "start": "2026-11-17T08:00:00", "end": "2026-11-17T09:00:00", "location": "Studio 2" }, { "original_start": "2026-12-01T07:30:00", "status": "cancelled" } ] } } ``` | Feld | Regeln | | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | `rules` | 1 bis 5 RRULE-Strings nach RFC 5545, je bis 500 Zeichen. Das Präfix `RRULE:` ist optional. Mehrere Regeln werden im Feed zu getrennten Serien. | | `except_dates` | bis 1.000 Termine, die ausfallen und spurlos verschwinden. Ein Datum genügt; bei Serien mit Uhrzeit ist damit der Termin an diesem Tag gemeint. | | `overrides` | bis 500 geänderte Einzeltermine, siehe unten. | **Erlaubte RRULE-Teile:** `FREQ` (`DAILY`, `WEEKLY`, `MONTHLY`, `YEARLY`), `INTERVAL` (1 bis 1.000), `COUNT` (1 bis 1.000), `UNTIL`, `BYDAY`, `BYMONTHDAY`, `BYMONTH`, `BYSETPOS`, `WKST`. `COUNT` und `UNTIL` schließen sich aus. Andere Teile wie `BYHOUR` oder `FREQ=HOURLY` werden mit `unsupported_rrule` abgelehnt. **`UNTIL`** darf `YYYYMMDD`, `YYYYMMDDTHHMMSS` (lokale Zeit in der Zeitzone des Termins) oder `YYYYMMDDTHHMMSSZ` (UTC) sein. Wir rechnen es so um, wie RFC 5545 es verlangt. Ein reines Datum bei einem Termin mit Uhrzeit heißt „bis einschließlich diesen Tag“. ### Einzeltermine ändern: `overrides` [Abschnitt betitelt „Einzeltermine ändern: overrides“](#einzeltermine-ändern-overrides) * `original_start` bezeichnet den Termin so, wie die Regel ihn erzeugt, in der Zeitzone des Termins (bei ganztägigen Serien ein Datum). * Ändern kannst du `start`, `end`, `title`, `description`, `location`, `url` und `status`. Weggelassene Felder übernehmen den Wert der Serie. * `"status": "cancelled"` sagt nur diesen einen Termin ab. Soll er spurlos verschwinden, nimm stattdessen `except_dates`. * Overrides sind Teil des Termins: Jedes `PUT` schickt die **vollständige** Liste. Ein Override, den du weglässt, fällt auf die Serie zurück. * Jeder Termin der Serie darf nur einmal überschrieben werden (sonst `duplicate_override`). ## Mapping typischer Plugin-Felder [Abschnitt betitelt „Mapping typischer Plugin-Felder“](#mapping-typischer-plugin-felder) So bildest du übliche Felder eines Event-Plugins (WordPress und ähnliche) ab: | Im Plugin | In der API | | ------------------------------------------ | ------------------------------------------------------------------------- | | Post-ID | `external_id`, z. B. `"wp-1482"` | | Titel | `title` | | Inhalt / Beschreibung (HTML) | `description`. HTML geht direkt; besser ist ein kurzer Auszug plus `url`. | | Permalink der Veranstaltung | `url` | | Veranstaltungsort, Adresse | `location`, z. B. `"Studio am Fluss, Hauptstraße 5, Berlin"` | | Startdatum + Startzeit | `start`: `"2026-11-12T18:00:00"` | | Enddatum + Endzeit | `end`: `"2026-11-12T19:30:00"` | | Zeitzone der Website (`timezone_string`) | `timezone` am Kalender, nur bei Abweichung am Termin | | „Ganztägig“ angehakt | `start`/`end` als reines Datum, `end` + 1 Tag | | Kategorien, Schlagwörter | `categories` | | Status „abgesagt“ | `"status": "cancelled"` | | Status „vorläufig“ | `"status": "tentative"` | | Beitrag in den Papierkorb, Entwurf, privat | `DELETE` auf den Termin | | Eigene Felder (Preis, Ticket-ID …) | `metadata` (nur für dich) oder als Text in `description` (für Abonnenten) | Wiederholungseinstellungen: | Einstellung im Plugin | RRULE | | -------------------------------------------- | ---------------------------------------------- | | Täglich / wöchentlich / monatlich / jährlich | `FREQ=DAILY` / `WEEKLY` / `MONTHLY` / `YEARLY` | | Alle 2 Wochen | `FREQ=WEEKLY;INTERVAL=2` | | Dienstags und donnerstags | `FREQ=WEEKLY;BYDAY=TU,TH` | | Jeden zweiten Montag im Monat | `FREQ=MONTHLY;BYDAY=2MO` | | Letzter Freitag im Monat | `FREQ=MONTHLY;BYDAY=-1FR` | | Am 15. jedes Monats | `FREQ=MONTHLY;BYMONTHDAY=15` | | Endet nach 10 Terminen | `;COUNT=10` | | Endet am 25. März 2027 | `;UNTIL=20270325` | | Ausgenommene Tage (Ferien, Feiertage) | `recurrence.except_dates` | | Einzelner Termin verschoben | `recurrence.overrides` | Für PHP baut und prüft die MIT-lizenzierte Bibliothek [rlanvin/php-rrule](https://github.com/rlanvin/php-rrule) solche Regeln. ## Termin lesen [Abschnitt betitelt „Termin lesen“](#termin-lesen) ```bash curl https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/events/wp-1482 -H "Authorization: Bearer $KS_KEY" ``` Gibt es den Termin nicht: `404` [`event_not_found`](/api/errors/event_not_found/). ## Termine auflisten [Abschnitt betitelt „Termine auflisten“](#termine-auflisten) ```bash curl "https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/events?limit=100" -H "Authorization: Bearer $KS_KEY" ``` | Parameter | Bedeutung | | --------------- | ----------------------------------------------------------------------------------------------- | | `limit` | 1 bis 100, Standard 100 | | `cursor` | `next_cursor` der vorigen Seite | | `updated_since` | ISO-Zeitpunkt mit Offset, z. B. `2026-11-01T00:00:00Z`: nur Termine, die danach geändert wurden | Die Antwort enthält `data` (Termine wie oben) und `next_cursor` (`null` auf der letzten Seite). Sortiert wird nach letzter Änderung, sodass `updated_since` plus Cursor jede Änderung genau einmal liefert. Ein ungültiger Cursor ergibt `400` [`invalid_cursor`](/api/errors/invalid_cursor/). ## Termin löschen [Abschnitt betitelt „Termin löschen“](#termin-löschen) ```bash curl -X DELETE https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/events/wp-1482 -H "Authorization: Bearer $KS_KEY" ``` Antwort immer `204 No Content`, auch wenn der Termin schon weg war. Wiederholungen sind also unbedenklich. ## Validierungsfehler [Abschnitt betitelt „Validierungsfehler“](#validierungsfehler) Ungültige Termine werden komplett abgelehnt, mit `400` [`invalid_request`](/api/errors/invalid_request/) und **allen** Problemen auf einmal in `errors`: ```json { "type": "https://docs.kalender-sync.de/en/api/errors/invalid_request", "title": "The request is invalid", "status": 400, "code": "invalid_request", "request_id": "req_…", "errors": [ { "field": "end", "code": "end_before_start", "message": "end must not be before start." }, { "field": "recurrence.rules[0]", "code": "unsupported_rrule", "message": "BYHOUR is not supported." } ] } ``` | `errors[].code` | Bedeutung | | -------------------- | ------------------------------------------------------------------- | | `invalid_timezone` | Unbekannte Zeitzone | | `invalid_date` | Datum unlesbar (ganztägige Termine, `except_dates`) | | `invalid_datetime` | Datum mit Uhrzeit unlesbar, oder ein Override passt nicht zur Serie | | `end_before_start` | `end` liegt vor `start` (ganztägig: nicht danach) | | `invalid_rrule` | Regel syntaktisch falsch, z. B. `COUNT` und `UNTIL` zusammen | | `unsupported_rrule` | Regelteil oder Frequenz wird nicht unterstützt | | `duplicate_override` | Ein Einzeltermin wurde doppelt überschrieben | | `too_large` | `metadata` größer als 2 KB | Verstöße gegen das Schema (fehlendes Pflichtfeld, unbekanntes Feld, zu langer Text) tragen den Code des Validators, z. B. `invalid_type`, `too_big` oder `unrecognized_keys`. Weitere mögliche Fehler beim Schreiben: [`event_limit_reached`](/api/errors/event_limit_reached/), [`calendar_not_found`](/api/errors/calendar_not_found/), [`plan_required`](/api/errors/plan_required/), [`calendar_blocked`](/api/errors/calendar_blocked/). # Full Sync > Den Abo-Kalender vollständig mit deinem System abgleichen. Sync starten, alle Termine per Batch schicken, abschließen. Was nicht bestätigt wurde, wird gelöscht, mit Schutz vor versehentlichem Leeren. War dein Plugin eine Zeit lang aus oder ist eine Anfrage verloren gegangen, bringt ein **Full Sync** den Kalender wieder auf den Stand deines Systems. Empfehlung: beim ersten Verbinden und danach einmal täglich, zum Beispiel per WP-Cron. ## Ablauf [Abschnitt betitelt „Ablauf“](#ablauf) **1. Sync starten** ```bash curl -X POST https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/syncs \ -H "Authorization: Bearer $KS_KEY" ``` ```json { "sync_id": "sync_XXXXXXXXXXXXXXXX", "expires_at": "2026-11-03T15:02:11.000Z" } ``` Ein Sync ist **eine Stunde** gültig. **2. Alle aktuellen Termine schicken** Schick jeden Termin, den es in deinem System gibt, per [Batch](/api/batch/) mit der `sync_id`: ```bash curl https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/events/batch \ -H "Authorization: Bearer $KS_KEY" \ -H "Content-Type: application/json" \ -d '{ "sync_id": "sync_XXXXXXXXXXXXXXXX", "operations": [ { "method": "PUT", "external_id": "wp-1482", "event": { "title": "Sunset Yoga", "start": "2026-11-12T18:00:00" } }, { "method": "PUT", "external_id": "wp-1490", "event": { "title": "Yin Yoga", "start": "2026-11-13T18:30:00" } } ] }' ``` Unveränderte Termine kosten dabei nichts: Sie werden nur als bestätigt markiert, nicht neu geschrieben. Die `sync_id` gibt es nur im Batch, nicht beim Einzel-PUT. **3. Sync abschließen** ```bash curl -X POST https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/syncs/sync_XXXXXXXXXXXXXXXX/complete \ -H "Authorization: Bearer $KS_KEY" ``` ```json { "sync_id": "sync_XXXXXXXXXXXXXXXX", "deleted": 3, "remaining": 42 } ``` Dabei werden alle Termine gelöscht, die während des Syncs **nicht** geschickt wurden. Termine, die du während des Syncs außerhalb davon geschrieben hast (zum Beispiel ein normales Speichern auf der Website), bleiben erhalten. ## Schutz vor versehentlichem Leeren [Abschnitt betitelt „Schutz vor versehentlichem Leeren“](#schutz-vor-versehentlichem-leeren) Würde das Abschließen **mehr als die Hälfte** der Termine löschen, lehnt die API mit `409` [`large_delete`](/api/errors/large_delete/) ab. Ein halb fertiger Export soll nie einen Kalender mit tausenden Abonnenten leeren. Ist das Löschen gewollt, bestätige es: ```bash curl -X POST https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/syncs/sync_XXXXXXXXXXXXXXXX/complete \ -H "Authorization: Bearer $KS_KEY" \ -H "Content-Type: application/json" \ -d '{ "confirm_large_delete": true }' ``` ## Fehler [Abschnitt betitelt „Fehler“](#fehler) | Code | Wann | | ----------------------------------------------- | ---------------------------------------------- | | [`sync_not_found`](/api/errors/sync_not_found/) | Die `sync_id` gehört nicht zu diesem Kalender. | | [`sync_expired`](/api/errors/sync_expired/) | Die Stunde ist um. Starte einen neuen Sync. | | [`sync_completed`](/api/errors/sync_completed/) | Der Sync wurde schon abgeschlossen. | | [`large_delete`](/api/errors/large_delete/) | Mehr als die Hälfte würde gelöscht. | # Idempotenz > Anfragen sicher wiederholen. PUT und DELETE auf Termine sind idempotent, Kalender legst du mit Idempotency-Key an. Netzwerke sind unzuverlässig. Bekommst du auf eine Anfrage keine Antwort, sollst du sie einfach wiederholen können, ohne doppelte Kalender oder Termine zu erzeugen. ## Termine: von Haus aus idempotent [Abschnitt betitelt „Termine: von Haus aus idempotent“](#termine-von-haus-aus-idempotent) * **`PUT` auf einen Termin** schreibt den Termin unter deiner `external_id`. Doppelt geschickt ergibt das denselben Termin. Ist nichts anders als vorher, kommt `"changed": false`, und nichts wird geschrieben. * **`DELETE` auf einen Termin** antwortet immer `204`, auch wenn der Termin schon gelöscht war. * **Batch** besteht aus `PUT` und `DELETE` und lässt sich deshalb ebenfalls komplett wiederholen. ## Kalender anlegen: `Idempotency-Key` [Abschnitt betitelt „Kalender anlegen: Idempotency-Key“](#kalender-anlegen-idempotency-key) `POST /v1/publisher/calendars` legt bei jedem Aufruf einen neuen Kalender an. Schick deshalb einen eindeutigen Header mit, zum Beispiel eine UUID: ```bash 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" }' ``` * Wiederholst du **dieselbe Anfrage mit demselben Key** innerhalb von 24 Stunden, bekommst du die gespeicherte Antwort des ersten Aufrufs zurück, mit dem Header `Idempotent-Replayed: true`. Es entsteht kein zweiter Kalender. * Derselbe Key mit **einer anderen Anfrage** (anderer Body oder Pfad) ergibt `409` [`idempotency_key_reused`](/api/errors/idempotency_key_reused/). * Läuft die erste Anfrage noch, ergibt eine Wiederholung `409` [`idempotency_in_progress`](/api/errors/idempotency_in_progress/). Warte kurz und versuche es erneut. * Ist die erste Anfrage mit einem Fehler gescheitert, wird nichts gespeichert. Die Wiederholung läuft dann ganz normal. * Der Key darf bis zu 255 Zeichen lang sein, sonst `400` [`invalid_idempotency_key`](/api/errors/invalid_idempotency_key/). Er gilt pro API-Key. ## Optimistisches Sperren [Abschnitt betitelt „Optimistisches Sperren“](#optimistisches-sperren) Willst du verhindern, dass zwei Systeme sich gegenseitig überschreiben, schick bei `PUT` auf einen Termin den Header `If-Match` mit der zuletzt gesehenen `sequence`. → [Termine: If-Match](/api/events/#optimistisches-sperren-mit-if-match) # Bilder > Logo und Banner der Abo-Seite per API hochladen und entfernen. PNG, JPEG oder WebP als Rohdaten, kein SVG. Die [Abo-Seite](/abo-kalender/abo-seite/) zeigt ein **Logo** neben dem Namen und ein **Banner** oben. Beide lädst du als Rohbild hoch, also das Bild selbst als Request-Body, nicht als JSON oder Formular. ```plaintext PUT /v1/publisher/calendars/{calendar_id}/images/logo PUT /v1/publisher/calendars/{calendar_id}/images/banner DELETE /v1/publisher/calendars/{calendar_id}/images/logo DELETE /v1/publisher/calendars/{calendar_id}/images/banner ``` ## Hochladen [Abschnitt betitelt „Hochladen“](#hochladen) ```bash curl -X PUT https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/images/logo \ -H "Authorization: Bearer $KS_KEY" \ -H "Content-Type: image/png" \ --data-binary @logo.png ``` Wichtig ist `--data-binary`, damit curl das Bild unverändert schickt. Die Antwort ist `200 OK` mit dem vollständigen [Kalender](/api/calendars/#die-antwort), darin die neue `logo_url` bzw. `banner_url`. Ein neues Bild ersetzt das alte. | | Logo | Banner | | ---------- | ------------------------------------ | ---------------------------------- | | Formate | PNG, JPEG, WebP | PNG, JPEG, WebP | | Größe | bis 512 KB | bis 2 MB | | Empfehlung | quadratisch, mindestens 192 × 192 px | etwa 3:1, mindestens 1200 px breit | * **Content-Type:** `image/png`, `image/jpeg`, `image/webp` oder `application/octet-stream`. Ob es wirklich ein PNG, JPEG oder WebP ist, prüfen wir am Inhalt der Datei, nicht am Header. * **Kein SVG.** SVG kann Skripte enthalten und wird deshalb abgelehnt. * Die Seitenverhältnisse und Mindestgrößen sind Empfehlungen für eine gute Darstellung. Die API prüft nur Format und Dateigröße. ## Entfernen [Abschnitt betitelt „Entfernen“](#entfernen) ```bash curl -X DELETE https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/images/banner \ -H "Authorization: Bearer $KS_KEY" ``` Antwort `204 No Content`. ## Bild-URLs [Abschnitt betitelt „Bild-URLs“](#bild-urls) `logo_url` und `banner_url` zeigen auf unsere eigene Domain, zum Beispiel ```plaintext https://app.kalender-sync.de/api/public/subscribe/cal_XXXXXXXXXXXX/images/logo?v=… ``` Der Parameter `v` ändert sich mit jedem neuen Bild. So können Browser die Bilder lange zwischenspeichern und zeigen trotzdem nach einem Upload das neue. Besucher der Abo-Seite laden dabei nichts von fremden Servern. ## Fehler [Abschnitt betitelt „Fehler“](#fehler) | Code | Status | Wann | | --------------------------------------------------------------- | ------ | ---------------------------------------------------- | | [`invalid_image`](/api/errors/invalid_image/) | 400 | Leerer Body | | [`image_too_large`](/api/errors/image_too_large/) | 413 | Logo über 512 KB, Banner über 2 MB | | [`unsupported_image_type`](/api/errors/unsupported_image_type/) | 415 | Inhalt ist kein PNG, JPEG oder WebP (z. B. SVG, GIF) | | [`unsupported_media_type`](/api/errors/unsupported_media_type/) | 415 | Content-Type wird nicht angenommen | | [`payload_too_large`](/api/errors/payload_too_large/) | 413 | Body deutlich größer als 2 MB | # Limits und Rate Limits > 120 Anfragen pro Minute und Key, RateLimit-Header, Retry-After. Dazu alle Grenzen für Kalender, Termine, Batch, Bilder und Request-Größen. ## Rate Limit [Abschnitt betitelt „Rate Limit“](#rate-limit) Jeder Key darf **120 Anfragen pro Minute** senden. Gezählt wird in festen Fenstern von 60 Sekunden. Jede Antwort trägt den aktuellen Stand in Headern nach dem IETF-Entwurf für RateLimit-Header: ```plaintext RateLimit-Policy: "default";q=120;w=60 RateLimit: "default";r=87;t=34 ``` | Wert | Bedeutung | | ---- | ------------------------------------------ | | `q` | Anfragen pro Fenster | | `w` | Fenstergröße in Sekunden | | `r` | verbleibende Anfragen im aktuellen Fenster | | `t` | Sekunden bis zum nächsten Fenster | Ist das Limit erreicht, antwortet die API mit `429` [`rate_limited`](/api/errors/rate_limited/) und dem Header `Retry-After` (Sekunden). Warte so lange und wiederhole dann. Zusätzlich gibt es eine großzügige Obergrenze **pro IP-Adresse** (600 Anfragen pro Minute), damit mehrere Websites auf einem gemeinsamen Webhosting sich nicht gegenseitig ausbremsen. **Tipps:** * Für viele Termine nimm [Batch](/api/batch/): 100 Operationen zählen als eine Anfrage. * Schick Änderungen, wenn sie passieren, statt regelmäßig alles. Für den vollständigen Abgleich gibt es den [Full Sync](/api/full-sync/). * Unveränderte Termine erkennt die API selbst (`changed: false`); du musst dir dafür nichts merken. ## Grenzen nach Tarif [Abschnitt betitelt „Grenzen nach Tarif“](#grenzen-nach-tarif) | | Sandbox (jeder Tarif) | Basic | Professional | | ------------------------- | --------------------- | --------------- | ---------------- | | Kalender | 3 Testkalender | 1 Live-Kalender | 10 Live-Kalender | | Termine je Kalender | 500 | 5.000 | 5.000 | | Aktive Abonnenten (Konto) | | 500 | 5.000 | Eine Serie zählt als ein Termin. Mehr auf Anfrage. Was beim Erreichen passiert: [Tarife und Limits](/abo-kalender/tarife/#was-passiert-wenn-du-ein-limit-erreichst). ## Technische Grenzen [Abschnitt betitelt „Technische Grenzen“](#technische-grenzen) | | Grenze | | -------------------------- | ---------------------------------------------------------- | | Aktive Keys je Konto | 10 | | JSON-Body | 1 MB | | Batch | 100 Operationen | | Logo / Banner | 512 KB / 2 MB | | Kalendername | 100 Zeichen | | Kalenderbeschreibung | 1.000 Zeichen | | `external_id` | 1 bis 128 Zeichen: `A-Z a-z 0-9 . _ : -` | | Termintitel | 255 Zeichen | | Terminbeschreibung | 65.536 Zeichen Eingabe, gespeichert bis 8.000 Zeichen Text | | Ort | 500 Zeichen | | URLs | 2.000 Zeichen, nur `https://` | | `categories` | 10 Einträge à 50 Zeichen | | `metadata` | 2 KB JSON | | `recurrence.rules` | 5 Regeln à 500 Zeichen | | `recurrence.except_dates` | 1.000 | | `recurrence.overrides` | 500 | | `COUNT`, `INTERVAL` | 1 bis 1.000 | | `default_duration` | bis `PT24H` | | Seitengröße beim Auflisten | 100 | | Gültigkeit eines Full Sync | 1 Stunde | | `Idempotency-Key` | 255 Zeichen, 24 Stunden gespeichert | # Schnellstart > In fünf curl-Aufrufen vom Sandbox-Key zum abonnierbaren Kalender. Key anlegen, prüfen, Kalender anlegen, Termin schreiben, abonnieren. Für den Schnellstart reicht ein kostenloses Konto. Du arbeitest mit einem **Sandbox-Key**: Er legt Testkalender an, die in echten Kalender-Apps funktionieren, aber als Test gekennzeichnet sind. ## 1. Sandbox-Key anlegen [Abschnitt betitelt „1. Sandbox-Key anlegen“](#1-sandbox-key-anlegen) 1. Melde dich in der [Kalender Sync App](https://app.kalender-sync.de/) an oder lege ein kostenloses Konto an. 2. Öffne **Einstellungen › Entwickler / API**. 3. Gib dem Key einen Namen und klicke **Sandbox-Key erstellen**. 4. Kopiere den Key. Er wird **genau einmal** angezeigt. Leg ihn für die folgenden Aufrufe in eine Umgebungsvariable: ```bash export KS_KEY="ks_test_…" ``` ## 2. Key prüfen [Abschnitt betitelt „2. Key prüfen“](#2-key-prüfen) ```bash curl https://api.kalender-sync.de/v1/me \ -H "Authorization: Bearer $KS_KEY" ``` ```json { "account_id": "…", "key": { "id": "…", "name": "Meine Website", "mode": "test", "scopes": ["publisher:read", "publisher:write", "publisher:stats"], "calendar_ids": null } } ``` `mode: "test"` heißt: Dieser Key sieht nur Testkalender. ## 3. Kalender anlegen [Abschnitt betitelt „3. Kalender anlegen“](#3-kalender-anlegen) ```bash curl https://api.kalender-sync.de/v1/publisher/calendars \ -H "Authorization: Bearer $KS_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{ "name": "Riverside Yoga", "description": "Kurse und Workshops im Studio am Fluss.", "timezone": "Europe/Berlin", "language": "de", "site_url": "https://example.org", "brand_color": "#0f766e" }' ``` Die Antwort (`201 Created`) enthält alles, was du für die nächsten Schritte brauchst: ```json { "id": "cal_XXXXXXXXXXXX", "mode": "test", "name": "Riverside Yoga", "timezone": "Europe/Berlin", "default_duration": "PT1H", "show_events": true, "subscribe_page_url": "https://app.kalender-sync.de/subscribe/cal_XXXXXXXXXXXX", "feed_url": "https://feeds.kalender-sync.de/f_….ics", "subscribe_links": { "google": "…", "outlook": "…", "office365": "…", "apple": "webcal://…" }, "event_count": 0, "…": "…" } ``` Merk dir die `id`: ```bash export KS_CAL="cal_XXXXXXXXXXXX" ``` ## 4. Termin schreiben [Abschnitt betitelt „4. Termin schreiben“](#4-termin-schreiben) Termine legst du per `PUT` unter deiner eigenen ID an, hier `wp-101`. Derselbe Aufruf ändert den Termin später. ```bash curl -X PUT https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/events/wp-101 \ -H "Authorization: Bearer $KS_KEY" \ -H "Content-Type: application/json" \ -d '{ "title": "Sunset Yoga", "start": "2026-11-12T18:00:00", "end": "2026-11-12T19:15:00", "location": "Dachterrasse, Hauptstraße 5, Berlin", "description": "Bring eine Matte mit.", "url": "https://example.org/kurse/sunset-yoga" }' ``` Ohne `timezone` im Termin gilt die Zeitzone des Kalenders. Die Antwort ist `201 Created` beim ersten Mal und `200 OK` bei jeder Änderung. Schickst du denselben Termin noch einmal, kommt `"changed": false`. Eine wöchentliche Serie sieht so aus: ```bash curl -X PUT https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/events/wp-102 \ -H "Authorization: Bearer $KS_KEY" \ -H "Content-Type: application/json" \ -d '{ "title": "Morning Flow", "start": "2026-11-03T07:30:00", "end": "2026-11-03T08:30:00", "recurrence": { "rules": ["FREQ=WEEKLY;BYDAY=TU;COUNT=8"] } }' ``` ## 5. Abonnieren [Abschnitt betitelt „5. Abonnieren“](#5-abonnieren) Öffne die `subscribe_page_url` aus Schritt 3 im Browser. Dort siehst du deine Termine, den Hinweis „Testkalender“ und den Button mit der App-Auswahl. Abonniere den Kalender testweise in deiner eigenen Kalender-App. Für deine Website brauchst du nur noch den Button: ```html
``` → [Button und ks:subscribe](/api/button/) ## Und dann? [Abschnitt betitelt „Und dann?“](#und-dann) * **Live gehen:** Lege unter **Einstellungen › Entwickler / API** einen Live-Key an (ab Basic) und wiederhole Schritt 3 damit. Sandbox- und Live-Kalender sind getrennt; Testkalender werden nicht zu Live-Kalendern. → [Tarife und Limits](/abo-kalender/tarife/) * **Viele Termine auf einmal:** [Batch](/api/batch/) * **Regelmäßig abgleichen:** [Full Sync](/api/full-sync/) * **Logo und Banner:** [Bilder](/api/images/) # Statistik > Aktive Abonnenten je App, Klicks der letzten 30 Tage und der Stand deines Kontos gegenüber dem Tarif. Ohne Personenbezug gezählt. ```plaintext GET /v1/publisher/calendars/{calendar_id}/stats ``` Braucht den Scope `publisher:stats`. ```bash curl https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/stats -H "Authorization: Bearer $KS_KEY" ``` ```json { "as_of": "2026-11-20T08:00:00.000Z", "subscribers": { "total": 97, "feed": { "total": 97, "by_app": { "google": 51, "apple": 30, "outlook": 12, "other": 4 } }, "live": { "total": 0, "by_provider": { "google": 0, "microsoft": 0, "icloud": 0 } } }, "direct_feed_clients_7d": null, "subscribe_clicks_30d": { "total": 160, "by_app": { "google": 70, "apple": 55, "outlook": 25, "other": 10 } }, "plan": { "plan": "basic", "live_calendars": { "used": 1, "limit": 1 }, "active_subscribers": { "used": 97, "limit": 500 }, "over_calendar_limit": false, "over_subscriber_limit": false } } ``` | Feld | Bedeutung | | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | | `subscribers.feed.total` | Aktive Abonnenten dieses Kalenders: Kalender-Apps, die den Feed in den letzten **14 Tagen** abgerufen haben. | | `subscribers.feed.by_app` | Aufgeteilt nach `google`, `apple`, `outlook` (Outlook.com, Microsoft 365 und Outlook Desktop zusammen) und `other`. | | `subscribers.live` | Für eine spätere Funktion reserviert, derzeit immer `0`. | | `subscribers.total` | Summe; derzeit gleich `feed.total`. | | `direct_feed_clients_7d` | Für eine spätere Schätzung reserviert, derzeit immer `null`. | | `subscribe_clicks_30d` | Jede App-Auswahl auf der Abo-Seite und im Button in den letzten 30 Tagen, egal ob danach abonniert wurde. | | `plan` | Dein **Konto** im Vergleich zum Tarif (über alle Live-Kalender). `plan.plan` ist `free`, `basic` oder `business` (auf der Website: Professional). | ## Was gezählt wird und was nicht [Abschnitt betitelt „Was gezählt wird und was nicht“](#was-gezählt-wird-und-was-nicht) * Gezählt werden Abos über die **Abo-Seite** und den **Button**. Jedes bekommt einen eigenen Feed-Link, dessen Abrufe wir zählen. * Nicht gezählt werden Abos über die allgemeine `feed_url` oder die `subscribe_links`, wenn du sie selbst einbaust. Diese funktionieren genauso, lassen sich aber nicht einzeln zählen. * Wir speichern keine IP-Adressen, keine User-Agents und nichts über die Personen hinter einem Abo. * Sandbox-Kalender haben eine eigene Statistik, zählen aber nicht für `plan.active_subscribers`. ## Limit erreicht [Abschnitt betitelt „Limit erreicht“](#limit-erreicht) `over_subscriber_limit: true` heißt: Dein Konto hat mehr aktive Abonnenten, als dein Tarif umfasst. **Es läuft trotzdem alles weiter.** Du bekommst zusätzlich eine E-Mail (höchstens alle 30 Tage). → [Tarife und Limits](/abo-kalender/tarife/) `over_calendar_limit: true` heißt: Dein Konto hat mehr Live-Kalender, als der Tarif umfasst, etwa nach einem Downgrade. Feeds laufen weiter, Schreibzugriffe antworten mit [`plan_required`](/api/errors/plan_required/). # AVV & Unterauftragnehmer > Auftragsverarbeitungsvertrag nach Art. 28 DSGVO und wo die maßgebliche Liste der Unterauftragnehmer steht. ## Auftragsverarbeitungsvertrag (AVV) [Abschnitt betitelt „Auftragsverarbeitungsvertrag (AVV)“](#auftragsverarbeitungsvertrag-avv) **AVV für alle Tarife bei geschäftlicher Nutzung inklusive – Bestandteil der AGB.** Setzt du Kalender Sync als Unternehmer ein (§ 14 BGB, auch als Freiberufler oder Einzelunternehmer), gilt der [AVV nach Art. 28 DSGVO](https://kalender-sync.de/avv/) mit Annahme der AGB – in Free, Basic und Professional, ohne Unterschrift und ohne Antrag. Über die Druckansicht kannst du ihn als PDF speichern. * Brauchst du für eure Unterlagen ein **unterzeichnetes Exemplar**, schreib an – der Inhalt ist identisch mit der Online-Fassung. * Für Verträge, die **vor dem 17. Oktober 2026** geschlossen wurden, gilt der AVV, sobald du ihn in Textform annimmst (eine kurze E-Mail genügt) oder er über eine AGB-Änderung einbezogen wird; bis dahin bekommst du ihn auf Anfrage. ## Unterauftragnehmer [Abschnitt betitelt „Unterauftragnehmer“](#unterauftragnehmer) Maßgeblich ist die **[Liste der Unterauftragnehmer](https://kalender-sync.de/unterauftragnehmer/)** auf kalender-sync.de. Sie ist Vertragsanlage zum AVV und nennt je Anbieter Zweck, Verarbeitungsort und Garantien. Neue oder ersetzte Unterauftragnehmer kündigen wir mindestens 30 Tage vorab per E-Mail an; du kannst innerhalb von 30 Tagen widersprechen (Ziffer 7 des AVV). Kurz zusammengefasst: * **Hetzner** (Deutschland) – Hosting von App und Datenbank in Nürnberg, verschlüsselte Backups in Falkenstein. * **Lettermint** (Niederlande) – Anmeldecodes und transaktionale E-Mails. * **Customer.io** (USA, EU-Datenregion, Standardvertragsklauseln) – Service-, Onboarding- und Testphasen-Mails; keine Kalenderinhalte oder Zugangsdaten. * **Brevo** (Frankreich) – nur noch historische Nachweise, aktiver Versand abgeschaltet. **Keine Unterauftragnehmer** sind die Kalenderdienste, die du selbst verbindest (Google, Microsoft, Apple iCloud, CalDAV-Anbieter): Kalenderdaten fließen nur zwischen deinen eigenen Konten. Ebenso wenig ein KI-Assistent, den du per MCP verbindest. Die Zahlungsabwicklung über Stripe erfolgt in unserer eigenen Verantwortlichkeit und ist in der [Datenschutzerklärung](https://kalender-sync.de/datenschutz/) beschrieben. ## Verbindliche Quellen [Abschnitt betitelt „Verbindliche Quellen“](#verbindliche-quellen) * [Auftragsverarbeitungsvertrag](https://kalender-sync.de/avv/) und [Liste der Unterauftragnehmer](https://kalender-sync.de/unterauftragnehmer/) – Vertragstexte * [AGB](https://kalender-sync.de/agb/) – Ziffer 10 bezieht den AVV ein * [IT-Admin-Seite](https://kalender-sync.de/it-admin/) – kompakte Übersicht für Compliance-Reviews (Scopes, Admin-Consent, Hosting) # DSGVO-Rechte umsetzen > Auskunft, Datenübertragbarkeit, Löschung und Widerruf — fast alles in Selbstbedienung. Die meisten DSGVO-Rechte kannst du bei Kalender Sync **direkt selbst ausüben** — ohne Anfrage und Wartefrist. ## Auskunft & Datenübertragbarkeit (Art. 15 & 20) [Abschnitt betitelt „Auskunft & Datenübertragbarkeit (Art. 15 & 20)“](#auskunft--datenübertragbarkeit-art-15--20) Der [Datenexport](/account-billing/export-delete/) in den Einstellungen lädt alle über dich gespeicherten Daten als JSON-Archiv — sofort, so oft du willst. Was drinsteckt (und warum keine Termininhalte), steht dort beschrieben. ## Berichtigung (Art. 16) [Abschnitt betitelt „Berichtigung (Art. 16)“](#berichtigung-art-16) Name, Branche und Sprache änderst du im [Profil](/account-billing/profile-notifications/). Für die E-Mail-Adresse (aktuell nicht selbst änderbar) hilft der [Support](/troubleshooting/contact-support/). ## Löschung (Art. 17) [Abschnitt betitelt „Löschung (Art. 17)“](#löschung-art-17) Die [Konto-Löschung](/account-billing/export-delete/) in den Einstellungen entfernt sofort und endgültig alle Daten — inklusive der Blocker in Zielkalendern und der Zugriffe auf deine Kalenderkonten. ## Widerruf von Einwilligungen (Art. 7) [Abschnitt betitelt „Widerruf von Einwilligungen (Art. 7)“](#widerruf-von-einwilligungen-art-7) * **Newsletter & Produkt-Updates**: Abmeldelink in jeder Mail oder Häkchen in den Einstellungen entfernen. * **Cookies/Statistik** auf der Website: über „Cookie-Einstellungen” im Footer jederzeit anpassbar. * **Kalender-Zugriffe**: Kalender jederzeit [entfernen](/connect-calendar/disconnect/) — den Konto-Zugriff widerrufst du direkt beim Anbieter. ## Beschwerde & Kontakt [Abschnitt betitelt „Beschwerde & Kontakt“](#beschwerde--kontakt) Verantwortlicher und Kontakt für Datenschutzanfragen stehen in der [Datenschutzerklärung](https://kalender-sync.de/datenschutz/) und im [Impressum](https://kalender-sync.de/impressum/). Unabhängig davon hast du das Recht, dich bei einer Datenschutz-Aufsichtsbehörde zu beschweren. Für alles, was hier nicht abgedeckt ist: — Datenschutzanfragen beantworten wir bevorzugt. # Kalender Sync in der Organisation freigeben > Für IT-Admins — Microsoft Admin-Consent in zwei Minuten erteilen, Google Workspace freischalten, Compliance-Fakten fürs Review. Diese Seite ist zum **Weiterleiten an die IT** gedacht: alles, was ein Admin für die einmalige Freigabe von Kalender Sync braucht. Die kompakte Übersicht mit dem klickbaren Admin-Consent-Link steht auf **[kalender-sync.de/it-admin](https://kalender-sync.de/it-admin/)**. ## Microsoft 365 / Entra ID [Abschnitt betitelt „Microsoft 365 / Entra ID“](#microsoft-365--entra-id) **Der schnelle Weg (\~2 Minuten):** 1. Als **Global Admin** den Admin-Consent-Link öffnen: → **[Admin-Consent für Kalender-Sync erteilen](https://login.microsoftonline.com/common/adminconsent?client_id=f656be6d-e0c1-43a4-a4a8-e1452eaf78f3\&redirect_uri=https%3A%2F%2Fkalender-sync.de%2Fadmin-consent-erteilt%2F)** (Client-ID zum Verifizieren: `f656be6d-e0c1-43a4-a4a8-e1452eaf78f3` — nach der Bestätigung leitet Microsoft auf unsere Bestätigungsseite weiter.) 2. Die angefragten Berechtigungen prüfen (`User.Read`, `Calendars.ReadWrite`, `offline_access` — [Details](/privacy-it/permissions/)) und bestätigen. 3. Fertig — die Zustimmung gilt tenant-weit, Nutzer:innen verbinden sich ab sofort ohne Rückfrage. Alternativ über das Entra-Portal: **Enterprise Applications → Kalender-Sync → Permissions → Grant admin consent**. Die Berechtigungen sind delegiert (delegated) — Kalender Sync agiert nur im Kontext des jeweils angemeldeten Nutzers, nie mit Anwendungsrechten auf fremde Postfächer. ## Google Workspace [Abschnitt betitelt „Google Workspace“](#google-workspace) 1. [Admin-Konsole](https://admin.google.com/) öffnen → **Sicherheit → Zugriffs- und Datenkontrolle → API-Steuerung → App-Zugriffssteuerung**. 2. **„App konfigurieren”** (bzw. „Apps verwalten” → „App hinzufügen”) → Suche nach **OAuth-App-Name oder Client-ID**: ```text 799110401428-vpauqp9v2ksno7vc6k2404pgg956tjit.apps.googleusercontent.com ``` Alternativ nach dem Namen **„Kalender Sync”** suchen. 3. Die App auswählen, den Geltungsbereich festlegen (gesamte Organisation oder einzelne Organisationseinheiten) und den Zugriff auf **„Vertrauenswürdig”** setzen → bestätigen. 4. Ab sofort können sich Nutzer:innen ohne Blockierung verbinden — die Zustimmung zu den Scopes erteilt weiterhin jede:r selbst im Google-Login. In der App-Detailansicht der Admin-Konsole sieht die IT dabei genau, welche Dienste angefragt werden (Google Log-in, Kalender) und welche Bereiche Nutzer:innen gewährt haben. Die angefragten Scopes (`calendar.events`, `calendar.calendarlist.readonly` + Identität) stehen auch unter [Berechtigungen im Detail](/privacy-it/permissions/). ## Fakten fürs Compliance-Review [Abschnitt betitelt „Fakten fürs Compliance-Review“](#fakten-fürs-compliance-review) * **Hosting & Datenbank in Deutschland** (Hetzner, Nürnberg; verschlüsselte Backups in Falkenstein) — [Sicherheits-Überblick](/privacy-it/security-overview/) * **Keine Speicherung von Termininhalten**, keine Übertragung von Teilnehmerdaten * Zugangsdaten **verschlüsselt at rest**, TLS in transit * **AVV nach Art. 28 DSGVO** — für alle Tarife bei geschäftlicher Nutzung inklusive, Bestandteil der AGB: [kalender-sync.de/avv](https://kalender-sync.de/avv/) · [AVV & Unterauftragnehmer](/privacy-it/dpa-subprocessors/) * Zustimmung jederzeit **widerrufbar** (tenant-weit oder pro Nutzer:in), Konten und Daten von Nutzer:innen [selbst löschbar](/account-billing/export-delete/) ## Wenn die Freigabe nicht infrage kommt [Abschnitt betitelt „Wenn die Freigabe nicht infrage kommt“](#wenn-die-freigabe-nicht-infrage-kommt) Nutzer:innen können den eigenen Kalender auch ohne OAuth-Freigabe als [iCal-Feed-Quelle](/connect-calendar/ical-feed/) einbinden — schreibgeschützt und ohne Admin-Beteiligung. Die Optionen im Vergleich: [Meine Organisation blockiert die Verbindung](/connect-calendar/org-blocked/). # Benötigte Berechtigungen im Detail > Welche Berechtigungen Kalender Sync bei Google, Microsoft und CalDAV anfragt — Scope für Scope erklärt. Kalender Sync fragt nur an, was für den Sync nötig ist — und nichts davon erlaubt Zugriff auf E-Mails, Dateien oder Kontakte. Hier die vollständige Aufschlüsselung, z. B. für IT-Reviews. ## Google Calendar [Abschnitt betitelt „Google Calendar“](#google-calendar) | Scope | Zweck | | -------------------------------- | -------------------------------------------------------------- | | `openid`, `profile`, `email` | Authentifizierung — wer ist eingeloggt | | `calendar.events` | Lesen + Schreiben von Kalendereinträgen (für die Busy-Blocker) | | `calendar.calendarlist.readonly` | Liste der verfügbaren Kalender abrufen | Google nutzt inkrementelle Zustimmung — die Häkchen im Consent-Dialog sollten gesetzt bleiben, sonst kann der Sync keine Blocker anlegen. ## Microsoft 365 / Outlook [Abschnitt betitelt „Microsoft 365 / Outlook“](#microsoft-365--outlook) | Scope | Zweck | | --------------------- | ---------------------------------------------------------------- | | `User.Read` | Authentifizierung — wer ist eingeloggt | | `Calendars.ReadWrite` | Lesen + Schreiben von Kalendereinträgen (für die Busy-Blocker) | | `offline_access` | Refresh-Token, damit der Sync im Hintergrund ohne Re-Login läuft | Kein Admin-Consent erforderlich — außer in strikt konfigurierten Tenants ([was dann?](/connect-calendar/org-blocked/)). ## Apple iCloud / KSuite (CalDAV) [Abschnitt betitelt „Apple iCloud / KSuite (CalDAV)“](#apple-icloud--ksuite-caldav) | Mechanismus | Zweck | | ---------------------------- | ------------------------------------------------------------------------------ | | App-spezifisches Passwort | Pro Verbindung ein eigenes Passwort, getrennt von der iCloud-/KSuite-Identität | | CalDAV `REPORT` / `PROPFIND` | Standard-CalDAV-Operationen zum Lesen + Schreiben | Kein OAuth — die App-Passwörter sind jederzeit beim Anbieter widerrufbar und geben keinen Zugriff auf andere Dienste des Kontos. ## iCal-Feeds [Abschnitt betitelt „iCal-Feeds“](#ical-feeds) Die Feed-URL (inkl. enthaltenem Token) wird wie ein Passwort behandelt und **verschlüsselt gespeichert**. Feeds sind rein lesend. ## Warum Schreibzugriff? [Abschnitt betitelt „Warum Schreibzugriff?“](#warum-schreibzugriff) Kalender Sync legt im Zielkalender eigene Blocker-Termine an, aktualisiert sie und räumt sie beim Beenden wieder auf — dafür braucht es Schreibrechte. Deine **Originaltermine werden nie verändert**; es werden ausschließlich die selbst erstellten Blocker angefasst. ## Zugriff beenden [Abschnitt betitelt „Zugriff beenden“](#zugriff-beenden) Einzelne Kalender lassen sich in Kalender Sync [entfernen](/connect-calendar/disconnect/), der Zugriff zusätzlich direkt beim Anbieter widerrufen — die Links stehen dort in der Übersichtstabelle. # Sicherheit & Datenschutz im Überblick > Hosting in Deutschland, Verschlüsselung und Datensparsamkeit — was Kalender Sync speichert und was nicht. Diese Sektion richtet sich an IT-Verantwortliche, Datenschutzbeauftragte — und alle, die genau wissen wollen, was mit ihren Daten passiert. Rechtsverbindlich ist die [Datenschutzerklärung](https://kalender-sync.de/datenschutz/); hier steht die verständliche Fassung. ## Das Wichtigste in Kürze [Abschnitt betitelt „Das Wichtigste in Kürze“](#das-wichtigste-in-kürze) * **Hosting in Deutschland**: Server und Datenbank laufen bei Hetzner in Nürnberg, verschlüsselte Backups in einer Hetzner Storage Box in Falkenstein (anderes Rechenzentrum) — keine US-Cloud als Unterbau. * **Termininhalte werden nicht gespeichert**: Kalender Sync persistiert nur Termin-**IDs** und **Prüfsummen** zur Änderungserkennung. Titel, Beschreibungen und Orte fließen nur während des Syncs durch. * **Daten Dritter bleiben außen vor**: Teilnehmerlisten, E-Mail-Adressen von Gästen, Organisator:innen und Zu-/Absagen werden [nie übertragen](/sync/visibility-levels/) — bei keiner Sichtbarkeitsstufe. * **Zugangsdaten verschlüsselt**: OAuth-Tokens, App-Passwörter und Feed-URLs liegen verschlüsselt in der Datenbank (ChaCha20-Poly1305); die Übertragung läuft durchgehend über TLS. * **Datensparsamkeit als Architektur**: Synchronisiert wird nur das [Zeitfenster](/sync/sync-window/) von −3 bis +6 Monaten (Professional: +18), und standardmäßig nur „belegt/frei”. ## Was gespeichert wird [Abschnitt betitelt „Was gespeichert wird“](#was-gespeichert-wird) | Kategorie | Inhalt | | ------------------ | --------------------------------------------------------------------------------------- | | Konto | E-Mail-Adresse, Name (optional), Spracheinstellung, Plan, Einwilligungs-Zeitstempel | | Kalender-Metadaten | Kalendername, Farbe, Schreibrechte — keine Inhalte | | Sync-Konfiguration | Syncs mit Sichtbarkeitsstufe, Platzhalter-Titel, Quell-/Zielkalender | | Sync-Zuordnungen | Termin-IDs (Quelle ↔ Blocker) und Prüfsummen — keine Inhalte | | Zugangsdaten | OAuth-Tokens / App-Passwörter / Feed-URLs, verschlüsselt | | Sitzungen | Browser, IP-Adresse, letzte Aktivität ([einsehbar](/account-billing/sessions-devices/)) | ## Was nicht gespeichert wird [Abschnitt betitelt „Was nicht gespeichert wird“](#was-nicht-gespeichert-wird) * Termininhalte (Titel, Beschreibung, Ort) — nur Durchfluss während des Syncs * Teilnehmerlisten und deren E-Mail-Adressen * Anhänge * E-Mails, Dateien oder Kontakte aus deinen Konten — darauf hat Kalender Sync [keine Berechtigung](/privacy-it/permissions/) ## Weiterführend [Abschnitt betitelt „Weiterführend“](#weiterführend) * [Benötigte Berechtigungen im Detail](/privacy-it/permissions/) * [AVV & Unterauftragnehmer](/privacy-it/dpa-subprocessors/) * [DSGVO-Rechte umsetzen](/privacy-it/gdpr-rights/) * Für IT-Abteilungen: [Kalender Sync in der Organisation freigeben](/privacy-it/org-approval/) # Mehrere Quellkalender in einem Sync > Mehrere Kalender gebündelt in ein Ziel synchronisieren — und wann getrennte Syncs besser sind. Ein Sync kann aus **mehreren Quellkalendern** gespeist werden — auch quer über deine verbundenen Konten hinweg. Alle Belegungen landen gebündelt im Zielkalender. ## So funktioniert’s [Abschnitt betitelt „So funktioniert’s“](#so-funktionierts) Im Schritt **„Kalender”** beim Erstellen einfach mehrere Kalender anhaken — z. B. Privat, Verein und Familie. Jede Belegung aus jedem dieser Kalender erzeugt einen Blocker im Ziel: ```text Privat ──┐ Verein ──┼──→ Arbeitskalender Familie ─┘ ``` Fehlt ein Kalender in der Liste, kannst du direkt aus dem Schritt heraus ein weiteres Konto verbinden — dein Zwischenstand bleibt erhalten. ## Ein Sync oder mehrere? [Abschnitt betitelt „Ein Sync oder mehrere?“](#ein-sync-oder-mehrere) **Ein Sync mit mehreren Quellen**, wenn … * alle Quellen dieselbe [Sichtbarkeitsstufe](/sync/visibility-levels/) und denselben [Platzhalter-Titel](/sync/placeholder-title/) haben sollen, * du es schlicht einfach halten willst (ein Sync = ein Eintrag im Dashboard). **Getrennte Syncs**, wenn … * die Empfängerseite unterscheiden soll, *was* sie blockt („Privat” vs. „Nebenprojekt” statt zweimal „Geblockt”), * Quellen unterschiedliche Sichtbarkeit brauchen (z. B. Familie „Nur belegt”, Nebenprojekt „Titel + Zeit”), * du einzelne Quellen später unabhängig [pausieren oder beenden](/sharings/pause-end/) willst. Getrennte Syncs zählen einzeln gegen dein [Plan-Limit](/account-billing/plans-limits/) — die gebündelte Variante ist also auch die sparsamere. ## Quellen nachträglich ändern [Abschnitt betitelt „Quellen nachträglich ändern“](#quellen-nachträglich-ändern) Quellen lassen sich jederzeit **nachträglich ändern**: Drei-Punkte-Menü der Freigabe → **„Bearbeiten”** — neue Quellen werden vollständig nachsynchronisiert, entfernte räumen ihre Kopien im Zielkalender automatisch ab → [Freigabe bearbeiten](/sync/freigabe-bearbeiten/). # Sync pausieren oder beenden > Sync anhalten oder dauerhaft beenden — und was dabei mit den Blocker-Terminen passiert. Beides geht jederzeit direkt im Dashboard beim jeweiligen Sync. Der Unterschied liegt darin, was mit den Blocker-Terminen passiert. ## Pausieren — Blocker bleiben stehen [Abschnitt betitelt „Pausieren — Blocker bleiben stehen“](#pausieren--blocker-bleiben-stehen) * Der Sync stoppt, die vorhandenen Blocker im Ziel **bleiben erhalten**. Praktisch, wenn du den Sync nur vorübergehend nicht brauchst. * Beim **Fortsetzen** gleicht Kalender Sync den Stand komplett ab — alles, was sich während der Pause geändert hat, wird nachgezogen. * Bei einem Zwei-Wege-Sync ([eigene Kalender synchronisieren](/sharings/self-sync/)) werden immer **beide Richtungen** gemeinsam pausiert und fortgesetzt. * Vor dem Pausieren fragt ein kurzer Dialog nach dem Grund — das hilft uns, das Produkt zu verbessern. Automatisch pausiert? Syncs können auch ohne dein Zutun pausiert werden: am **Ende der Testphase** oder nach einer **Kündigung**, wenn sie über das Limit des Free-Plans hinausgehen. Nach einer **Kündigung** bleiben die kopierten Einträge erhalten; am **Ende der Testphase** werden die Kopien von Syncs eigener Kalender nach 14 Tagen **entfernt** (deine Originaltermine bleiben unberührt). In beiden Fällen wird nach einem Upgrade alles automatisch aus deinen Originalkalendern **wiederhergestellt**. Details: [Testphase](/account-billing/trial/) und [Pläne & Limits](/account-billing/plans-limits/). Beim manuellen Fortsetzen gilt das Plan-Limit ebenfalls: Auf Free kannst du z. B. nicht zwei Syncs gleichzeitig aktiv haben, indem du abwechselnd pausierst. ## Beenden — Blocker werden aufgeräumt [Abschnitt betitelt „Beenden — Blocker werden aufgeräumt“](#beenden--blocker-werden-aufgeräumt) * Der Sync endet **dauerhaft**; alle von Kalender Sync erstellten Blocker im Ziel werden **automatisch entfernt**. Deine Originaltermine bleiben selbstverständlich unberührt. * Das Aufräumen läuft im Hintergrund: Bis die Blocker in allen Kalendern verschwunden sind, kann es **ein paar Minuten bis Stunden** dauern — je nach Anzahl der Termine und Tempo des Kalender-Anbieters. * Bei Freigaben (geteilten Syncs) kann **jede Seite** beenden: du als Absender:in im Dashboard, die Empfängerseite unter „Geteilt mit mir” → **„Beenden”**. * Ein Beenden lässt sich nicht rückgängig machen — aber ein neuer Sync ist in unter einer Minute angelegt. (Einstellungen wie Sichtbarkeit, Quellen oder Präfix änderst du übrigens ohne Beenden über „Bearbeiten” → [Freigabe bearbeiten](/sync/freigabe-bearbeiten/).) ## Kurz verglichen [Abschnitt betitelt „Kurz verglichen“](#kurz-verglichen) | | Pausieren | Beenden | | ------------------ | ------------------------------------------ | ------------------ | | Blocker im Ziel | bleiben stehen | werden aufgeräumt | | Wieder aktivierbar | ja, jederzeit (Abgleich läuft automatisch) | nein — neu anlegen | | Wer kann es | Absender:in | beide Seiten | # Eigene Kalender synchronisieren > Zwei eigene Kalender synchronisieren — in eine Richtung oder beide, mit Einstellungen pro Richtung. BasicVerfügbar ab Basic·[Pläne vergleichen](https://kalender-sync.de/preise/) Dieser Sync-Typ hält deine eigenen Kalender im Gleichklang — z. B. Arbeit und privat: Termine aus dem einen blocken automatisch den anderen. Kein Einladungslink nötig, läuft sofort nach dem Einrichten. ## Video: Eigene Kalender synchronisieren [Abschnitt betitelt „Video: Eigene Kalender synchronisieren“](#video-eigene-kalender-synchronisieren) ![Kalender synchronisieren: Outlook, Google & iCloud – ein- oder beidseitig](/images/video-posters/bi-1uvfRiCg.jpg) Mit Klick auf Play wird YouTube geladen. Daten werden an Google übertragen.Cookie-Einstellungen öffnen ## Eine Richtung oder beide? [Abschnitt betitelt „Eine Richtung oder beide?“](#eine-richtung-oder-beide) * **Eine Richtung** (A → B): Ein Kalender blockt den anderen, nicht umgekehrt. Typisch: Der private Kalender blockt den Arbeitskalender — die Arbeit bleibt privat unsichtbar. * **Beide Richtungen** (A ⇄ B), der **Zwei-Wege-Sync**: Beide blocken sich gegenseitig. Typisch: zwei gleichberechtigte Kalender (zwei Jobs, Arbeit ⇄ privat). Zählt fürs Plan-Limit als **ein** Sync. ## Einrichten [Abschnitt betitelt „Einrichten“](#einrichten) 1. **„Neuer Sync”** → **„Kalender synchronisieren”**. 2. **Richtung** wählen: „Eine Richtung” oder „Beide Richtungen”. 3. **Kalender** wählen — beim Zwei-Wege-Sync genau **zwei beschreibbare** Kalender (iCal-Feeds sind nur lesbar und gehen daher nicht als Zwei-Wege-Partner). 4. **Sichtbarkeit** festlegen — beim Zwei-Wege-Sync auf Wunsch **pro Richtung unterschiedlich**: Stufe, [Platzhalter-Titel](/sync/placeholder-title/) und [Ganztags-Verhalten](/sync/all-day-events/) lassen sich je Richtung einstellen („Pro Richtung →”). 5. Bei „Eine Richtung” noch das **Ziel** wählen — fertig. Die erste Synchronisation läuft im Hintergrund an. ## Gut zu wissen [Abschnitt betitelt „Gut zu wissen“](#gut-zu-wissen) * **Keine Schleifen**: Blocker werden nie zurück-synchronisiert — auch in beide Richtungen entsteht kein Ping-Pong ([so funktioniert der Sync](/sync/how-it-works/)). * **Pausieren pausiert beide Richtungen** — ein Zwei-Wege-Sync wird immer als Ganzes pausiert und fortgesetzt ([Pausieren & Beenden](/sharings/pause-end/)). * **Drei und mehr Kalender** verbindest du mit mehreren Syncs — Beispiele unter [Mehrere Konten & Ketten-Setups](/sync/multi-account-setups/). * Einstellungen nachträglich ändern: über das Drei-Punkte-Menü → **„Bearbeiten“** — Quellen, Zielkalender, Sichtbarkeit, Präfix und mehr ([Freigabe bearbeiten](/sync/freigabe-bearbeiten/)). # Kalender mit anderen teilen > Eine Freigabe an eine andere Person senden — Einladung, Status und Verwaltung im Detail. Mit einer geteilten Freigabe sieht eine andere Person deine Verfügbarkeiten — ohne dass sie Zugriff auf deinen Kalender bekommt. Sie erhält eine Einladung, wählt selbst den Zielkalender und kann die Freigabe jederzeit auf ihrer Seite beenden. ## Video: Teilen ohne private Termine zu zeigen [Abschnitt betitelt „Video: Teilen ohne private Termine zu zeigen“](#video-teilen-ohne-private-termine-zu-zeigen) ![Kalender teilen, ohne private Termine zu zeigen – mit Kalender Sync](/images/video-posters/LkEv0Hgj82k.jpg) Mit Klick auf Play wird YouTube geladen. Daten werden an Google übertragen.Cookie-Einstellungen öffnen ## Freigabe erstellen und verschicken [Abschnitt betitelt „Freigabe erstellen und verschicken“](#freigabe-erstellen-und-verschicken) Den kompletten Weg durch die Einrichtung zeigt [Erste Freigabe einrichten](/getting-started/first-sharing/) — die Kurzfassung: 1. **„Neuer Sync”** → **„Kalender teilen”** → Quellkalender und [Sichtbarkeitsstufe](/sync/visibility-levels/) wählen. 2. Im letzten Schritt die Einladung verschicken: **Link kopieren** und selbst senden (Messenger, Mail) — oder die E-Mail-Adresse eintragen, dann verschickt Kalender Sync die Einladung direkt. Die Empfängerseite bekommt **genau eine E-Mail** — keine weiteren, solange sie sich nicht registriert. ## Die Einladung [Abschnitt betitelt „Die Einladung“](#die-einladung) * Der Link ist **7 Tage gültig** und **einmal** verwendbar. * Solange die Annahme aussteht, zeigt das Dashboard die Freigabe als **„Ausstehend”** — dort kannst du den Einladungslink jederzeit **erneut kopieren** und nochmal verschicken. * **Link abgelaufen?** Freigabe beenden und neu anlegen — das erzeugt einen frischen Link und dauert unter einer Minute. Was die Empfängerseite beim Annehmen sieht und entscheidet (Zielkalender wählen oder neu anlegen lassen), steht aus ihrer Sicht unter [Ich habe eine Einladung erhalten](/getting-started/received-invite/) — der Link eignet sich auch zum Weiterschicken. ## Nach der Annahme [Abschnitt betitelt „Nach der Annahme“](#nach-der-annahme) * Der Status wechselt auf **„Aktiv”**, die erste Synchronisation läuft an (E-Mail, sobald fertig). * Ab dann fließen Änderungen automatisch — [so funktioniert der Sync](/sync/how-it-works/). * Die Empfängerseite sieht nur, was deine [Sichtbarkeitsstufe](/sync/visibility-levels/) erlaubt — Teilnehmerdaten nie. ## Verwalten [Abschnitt betitelt „Verwalten“](#verwalten) * **Pausieren / Beenden** kannst du jederzeit im Dashboard — beim Beenden werden alle Blocker bei der Empfängerseite aufgeräumt ([Details](/sharings/pause-end/)). * Auch die **Empfängerseite** kann die Freigabe jederzeit für sich beenden (unter „Geteilt mit mir”). * Sichtbarkeit, Platzhalter-Titel oder Quellen ändern: über das Drei-Punkte-Menü → **„Bearbeiten“** ([Freigabe bearbeiten](/sync/freigabe-bearbeiten/)). Nur der Zielkalender bleibt fest — der gehört der Empfängerseite. # Ganztägige Termine > Warum Geburtstage und Feiertage standardmäßig nicht den ganzen Tag blocken — und wie du das änderst. Ganztägige Termine sind meistens **Merker, keine Belegung**: Geburtstage, Feiertage, „Messe-Woche”, „Peter im Homeoffice”. Würden sie als belegt übertragen, wäre der ganze Tag im Zielkalender geblockt — und niemand könnte dich buchen, obwohl du frei bist. ## Standard: als frei behandeln [Abschnitt betitelt „Standard: als frei behandeln“](#standard-als-frei-behandeln) Deshalb werden ganztägige Termine standardmäßig **als frei** übertragen: Sie erscheinen im Ziel, blockieren aber keine Zeit. So bleibt z. B. ein Feiertagskalender als Quelle völlig unproblematisch. ## Alternative: den ganzen Tag blockieren [Abschnitt betitelt „Alternative: den ganzen Tag blockieren“](#alternative-den-ganzen-tag-blockieren) ![Einstellung „Ganztägige Ereignisse“ mit den Varianten Frei (Standard) und Blockiert](/images/app/de/wizard-all-day.webp) Die Einstellung im Sichtbarkeits-Schritt: „Frei“ (Standard) oder „Blockiert“ — mit Live-Vorschau. Soll ein ganztägiger Termin wirklich blocken (z. B. Urlaub), hast du zwei Möglichkeiten: 1. **Pro Sync umstellen**: Beim Erstellen im Schritt „Sichtbarkeit” die Karte **„Ganztägige Ereignisse”** aufklappen und statt „Frei” (Standard) die Variante **„Blockiert”** wählen. Gilt dann für *alle* ganztägigen Termine dieses Syncs; beim Zwei-Wege-Sync auch pro Richtung einstellbar. 2. **Pro Termin**: Den Urlaub als normalen Termin mit Uhrzeit anlegen (z. B. 0–24 Uhr oder 8–18 Uhr) — der wird immer als belegt übertragen, unabhängig von der Option. Tipp: Wenn nur *einzelne* ganztägige Termine blocken sollen, ist Weg 2 meist der bessere — sonst blocken plötzlich auch alle Geburtstage. ## Nachträglich ändern [Abschnitt betitelt „Nachträglich ändern“](#nachträglich-ändern) Die Option lässt sich jederzeit nachträglich ändern: im Dashboard über das Drei-Punkte-Menü der Freigabe → **„Bearbeiten“** → „Erweiterte Einstellungen“. Die bestehenden Kopien im Zielkalender werden automatisch angepasst → [Freigabe bearbeiten](/sync/freigabe-bearbeiten/). # Terminfarben übernehmen > Farben in den synchronisierten Terminen: wie in der Quelle (Google-Farben, Outlook-Kategorien, CalDAV) oder eine Farbe je Quellkalender. Viele färben Termine nach Art oder Person ein, z. B. Montage grün, Kundentermine rot. Andere wollen im Zielkalender einfach sehen, aus welchem Kalender ein Termin stammt. Beides geht mit **„Terminfarben übernehmen“**. Die Option gibt es ab dem Tarif **Basic**, für eigene Syncs und für Freigaben an andere Personen, in jede Richtung und bei jeder Sichtbarkeit. ## Die drei Einstellungen [Abschnitt betitelt „Die drei Einstellungen“](#die-drei-einstellungen) | Einstellung | Was im Zielkalender passiert | | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | **Aus** | Alle Kopien in der Farbe des Zielkalenders. | | **Wie in der Quelle** | Jede Kopie behält ihre Farbe und deren Namen, z. B. „Rene Termin“ in Rot. | | **Eine Farbe je Kalender** | Jede Kopie bekommt die Farbe ihres Quellkalenders, z. B. alles aus „Arbeit“ blau, alles aus „Verein“ grün. Die Farbe heißt wie der Kalender. | ## So funktioniert’s [Abschnitt betitelt „So funktioniert’s“](#so-funktionierts) 1. Beim Einrichten des Syncs (oder später über **„Bearbeiten“**) die Karte **„Terminfarben übernehmen“** aufklappen. 2. Eine der drei Einstellungen wählen. Bei neuen eigenen Syncs ist **„Wie in der Quelle“** schon gewählt, außer bei der Sichtbarkeit **„Nur belegt“**. Bei Freigaben an andere Personen ist die Option zunächst aus. 3. **Wie in der Quelle:** Die Karte zeigt die Farben, die in den nächsten vier Monaten vorkommen. Ein Klick auf eine Farbe benennt sie im Zielkalender um. 4. **Eine Farbe je Kalender:** Ein Klick auf einen Kalender wählt seine Farbe aus den 24 Google-Farben und, falls gewünscht, einen anderen Namen. Bereits synchronisierte Termine werden danach automatisch neu geschrieben. ![Karte „Terminfarben übernehmen“ im Sync-Assistenten mit der Einstellung „Wie in der Quelle“. Darunter die Farben aus den Kalendern: Kundentermin, Basilikum, Fokuszeit, Familie und Mandarine, jeweils mit Anzahl der Termine.](/images/app/de/event-colors-source.webp) „Wie in der Quelle“: Die Karte zeigt, welche Farben in deinen Kalendern vorkommen. Fehlende Kategorien legt Kalender Sync in Outlook an (+), ein Klick auf eine Farbe benennt sie um. ![Karte „Terminfarben übernehmen“ mit der Einstellung „Eine Farbe je Kalender“. Die Quellkalender „Arbeit“ in Blau und „Privat“ in Lila.](/images/app/de/event-colors-fixed.webp) „Eine Farbe je Kalender“: Jeder Quellkalender bekommt eine Farbe, die wie der Kalender heißt. Ein Klick auf einen Kalender ändert Farbe oder Name. ## Wie die Farbe übertragen wird [Abschnitt betitelt „Wie die Farbe übertragen wird“](#wie-die-farbe-übertragen-wird) Eine Farbe kommt **mit ihrem Namen** an. Fehlt der Name, nehmen wir den Google-Farbnamen, z. B. „Basilikum“ oder „Kakao“. | Kalender | So kommt die Farbe an | | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | | **Google** | als Google-Farbe (Label) mit demselben Namen. Fehlt sie im Zielkalender, legen wir sie an: alle 24 Google-Farben und eigene Farben. | | **Outlook / Microsoft 365** | als **Kategorie** mit demselben Namen. Outlook kennt 25 Kategoriefarben; wir nehmen die ähnlichste. | | **CalDAV** (z. B. Disroot, GMX, WEB.DE, mailbox.org) | als Farbangabe des Termins (`COLOR`) | | **Apple iCloud** | nicht möglich: Apple Kalender kennt nur Kalenderfarben, keine Farben pro Termin. Für iCloud-Zielkalender wird die Option deshalb nicht angeboten. | Bei CalDAV entscheidet das Kalenderprogramm, ob es die Farbe anzeigt. Nextcloud und Evolution zeigen sie an, DAVx5 nach dem Einschalten in den Einstellungen. ## Outlook: Kategorien [Abschnitt betitelt „Outlook: Kategorien“](#outlook-kategorien) * **Gibt es die Kategorie schon**, weisen wir sie nur zu. Deine Farbe dafür bleibt. * **Fehlt sie**, legen wir sie mit der passenden Farbe an. Outlook zeigt neu angelegte Kategorien manchmal erst nach einigen Stunden farbig an, bis dahin erscheinen sie grau. * **Umbenennen bitte in Kalender Sync**, nicht in Outlook. Benennst du eine Kategorie in Outlook um, legen wir den alten Namen beim nächsten Abgleich wieder an. Die **Farbe** einer Kategorie kannst du dagegen jederzeit in Outlook ändern (Einstellungen › Konto › Kategorien). * **Deine eigenen Kategorien bleiben:** Setzt du selbst eine Kategorie an einen synchronisierten Termin, entfernen wir sie nicht. * **Von Outlook zu Google:** In Outlook gibst du einem Termin über „Kategorisieren“ eine Kategorie. In Google kommt sie als Farbe mit demselben Namen an. ### Erlaubnis für Outlook-Kategorien [Abschnitt betitelt „Erlaubnis für Outlook-Kategorien“](#erlaubnis-für-outlook-kategorien) Meist legt Kalender Sync Kategorien ohne weitere Schritte an. Verlangt Microsoft eine zusätzliche Erlaubnis, erscheint der Button **„Erlaubnis erteilen“**: * bei eigenen Syncs in **„Bearbeiten“**, bei einem Outlook-zu-Outlook-Sync für beide Postfächer, * bei Freigaben an dich **im Dashboard**: Nur du kannst die Erlaubnis für dein Postfach erteilen. Andere Postfacheinstellungen lesen oder ändern wir nicht. Ohne Erlaubnis läuft der Sync ganz normal weiter, nur ohne Farben. Verlangt deine Organisation die Zustimmung der IT, findet deine IT-Abteilung die Details unter [Für IT-Admins](https://kalender-sync.de/it-admin/). ### Google-Farben im Zielkalender [Abschnitt betitelt „Google-Farben im Zielkalender“](#google-farben-im-zielkalender) Neue Google-Farben (Labels) darf nur anlegen, wem der Zielkalender gehört. Ist er nur für dich freigegeben, verwenden wir die ähnlichste der 11 klassischen Google-Farben. ## Freigaben an andere Personen [Abschnitt betitelt „Freigaben an andere Personen“](#freigaben-an-andere-personen) Teilst du deinen Kalender mit jemandem, entscheidest du, ob Farben mitkommen. Bei **„Wie in der Quelle“** sieht die andere Person auch die Farbnamen, z. B. „Arzt“. Bei **„Eine Farbe je Kalender“** sieht sie nur, aus welchem deiner Kalender ein Termin stammt. Die andere Person erfährt schon in der Einladung, dass Farben mitkommen. ## Gut zu wissen [Abschnitt betitelt „Gut zu wissen“](#gut-zu-wissen) * **Ausschalten:** Bereits übertragene Farben bleiben an den Kopien stehen. * **In beide Richtungen gleich:** Bei einem Zwei-Wege-Sync kommt eine Farbe mit demselben Namen zurück. * **Per KI-Assistent:** `create_sync` übernimmt Farben mit derselben Voreinstellung wie die App, `list_syncs` zeigt die Einstellung an. Ändern geht in der App → [Syncs per Assistent](/ki-assistent/syncs/). # Freigabe bearbeiten > Bestehende Syncs nachträglich ändern: Quellkalender, Zielkalender, Sichtbarkeit, Platzhalter-Titel und Präfix — ohne den Sync neu anzulegen. Bestehende Syncs lassen sich **nachträglich bearbeiten** — du musst nichts mehr beenden und neu anlegen. Öffne im Dashboard das **Drei-Punkte-Menü** der Freigabe und wähle **„Bearbeiten”**. ## Was du ändern kannst [Abschnitt betitelt „Was du ändern kannst“](#was-du-ändern-kannst) | Einstellung | Beschreibung | | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Quellkalender** | Kalender hinzufügen oder entfernen. Neue Quellen werden vollständig nachsynchronisiert (auch bestehende Termine), entfernte Quellen räumen ihre Kopien im Zielkalender automatisch ab. | | **Zielkalender** | Bei eigenen Syncs den Zielkalender wechseln. Die Kopien werden aus dem alten Ziel entfernt und in den neuen Kalender übertragen. | | **Sichtbarkeit** | Zwischen „Nur belegt”, „Titel + Zeit” und „Alle Details” wechseln — siehe [Sichtbarkeits-Stufen](/sync/visibility-levels/). | | **Platzhalter-Titel** | Den Text ändern, der bei „Nur belegt” statt „Geblockt” angezeigt wird — siehe [Platzhalter-Titel](/sync/placeholder-title/). | | **Präfix** | Pro Quellkalender ein Titel-Präfix setzen, ändern oder entfernen — siehe [Präfix im Zielkalender](/sync/source-prefix/). | | **Ganztägige Termine** | Unter „Erweiterte Einstellungen”: ob ganztägige Termine den Tag blockieren — siehe [Ganztägige Termine](/sync/all-day-events/). | | **Terminfarben** | Aus, wie in der Quelle oder eine Farbe je Kalender; einzelne Farben im Ziel umbenennen. Bei Zwei-Wege-Syncs gilt eine Einstellung für beide Richtungen — siehe [Terminfarben übernehmen](/sync/event-colors/). | Die **Sync-Vorschau** rechts im Dialog zeigt live, wie die Termine mit den neuen Einstellungen im Zielkalender aussehen werden. ## Was nach dem Speichern passiert [Abschnitt betitelt „Was nach dem Speichern passiert“](#was-nach-dem-speichern-passiert) Nach dem Speichern zeigt die Freigabe kurz **„Wird aktualisiert…”**: Kalender-Sync schreibt alle bereits synchronisierten Kopien im Hintergrund mit den neuen Einstellungen neu. Je nach Kalendergröße dauert das ein paar Sekunden bis wenige Minuten — du musst nichts weiter tun. * Deine **Originaltermine bleiben immer unverändert** — es werden nur die synchronisierten Kopien im Zielkalender angepasst. * Wechselst du auf eine **striktere Sichtbarkeit** (z. B. von „Alle Details” auf „Nur belegt”), werden auch ältere Kopien außerhalb des [Sync-Zeitfensters](/sync/sync-window/) entfernt, damit nirgendwo mehr Details stehen als gewünscht. * Beim **Zielkalender-Wechsel** ist die Freigabe während des Umzugs kurz pausiert und kommt automatisch zurück. ## Besonderheiten [Abschnitt betitelt „Besonderheiten“](#besonderheiten) * **Zwei-Wege-Sync**: Sichtbarkeit, Platzhalter, Präfix und Ganztags-Option lassen sich **pro Richtung** einstellen. Die beiden Kalender selbst sind beim Zwei-Wege-Sync fest — dafür beenden und neu anlegen. * **Freigaben an andere Personen**: Die Quellen und alle Darstellungs-Optionen kannst du bearbeiten; der Zielkalender gehört der Empfängerseite und bleibt fest. * **Nicht erreichbare Quellkalender** (z. B. beim Anbieter gelöscht) erscheinen in der Liste mit dem Hinweis „nicht erreichbar” und lassen sich abwählen — so tauschst du eine tote Quelle gegen eine neue, ohne den Sync zu verlieren. # So funktioniert der Sync > Richtung, Geschwindigkeit und Sicherheitsnetz — was im Hintergrund passiert, wenn sich ein Termin ändert. Jeder Sync arbeitet nach demselben Prinzip: Aus einem oder mehreren **Quellkalendern** fließen Belegungen in einen **Zielkalender**. Dort legt Kalender Sync eigene **Blocker-Termine** an — und verwaltet ausschließlich diese. ![Kalender Sync Dashboard mit verbundenen Kalendern und aktiven Syncs](/images/app/de/dashboard.webp) Das Dashboard: verbundene Kalender oben, die aktiven Syncs darunter. ## Immer in eine Richtung [Abschnitt betitelt „Immer in eine Richtung“](#immer-in-eine-richtung) * Jeder Sync überträgt von **Quelle → Ziel**. Sollen sich zwei Kalender **gegenseitig** blocken, richtest du ihn [in beide Richtungen](/sharings/self-sync/) ein. * Deine **Originaltermine werden nie verändert** — egal was passiert. Kalender Sync fasst nur die eigenen Blocker an. * Termin in der Quelle **verschoben**? Der Blocker zieht mit. **Gelöscht**? Der Blocker verschwindet. ## Wie schnell ist der Sync? [Abschnitt betitelt „Wie schnell ist der Sync?“](#wie-schnell-ist-der-sync) | Quelle | Mechanismus | Tempo | | ----------------------------------------------------------------------------------- | ------------------------------------------- | ---------------------------------------------------------------- | | Google, Microsoft | Anbieter meldet Änderungen aktiv (Webhooks) | **nahezu sofort** (in allen Plänen) — typisch unter einer Minute | | Apple iCloud, GMX, WEB.DE, mailbox.org, Posteo, STRATO, Disroot, KSuite, iCal-Feeds | Regelmäßiger Abruf (Polling) | **alle 5 Minuten** | Hinweis Die Echtzeit-Übertragung per Webhook für Google und Microsoft ist in **allen Plänen** aktiv – auch im Free-Plan. Apple iCloud, GMX, WEB.DE, mailbox.org, Posteo, STRATO, Disroot, KSuite und iCal-Feeds (ab Basic) werden alle 5 Minuten abgefragt. Dazu kommt ein **Sicherheitsnetz**: Alle paar Stunden gleicht Kalender Sync jeden Sync komplett ab und fängt so auch verpasste Änderungen ein (z. B. wenn eine Anbieter-Benachrichtigung verloren ging). Fehlt ein Termin also scheinbar — oft löst sich das von selbst beim nächsten Abgleich. Wenn nicht: [Termin fehlt, doppelt oder verspätet](/troubleshooting/event-missing-or-duplicate/). Die **erste Synchronisation** nach dem Einrichten arbeitet den Bestand auf und kann je nach Terminanzahl einige Minuten dauern (bei großen Kalendern bis zu einer halben Stunde) — du bekommst eine E-Mail, sobald sie fertig ist. ## Was synchronisiert wird — und was nicht [Abschnitt betitelt „Was synchronisiert wird — und was nicht“](#was-synchronisiert-wird--und-was-nicht) * Synchronisiert werden Termine im [Zeitfenster](/sync/sync-window/): **3 Monate in die Vergangenheit; in die Zukunft abhängig vom Plan: 6 Monate (Free & Basic) bzw. 18 Monate (Professional)**. * Wie viel Inhalt ankommt, bestimmt die [Sichtbarkeitsstufe](/sync/visibility-levels/) — von „Nur belegt” bis volle Details. * **Nie übertragen**: Teilnehmerlisten, E-Mail-Adressen, Organisator:innen, Zu-/Absagen. [Ganztägige Termine](/sync/all-day-events/) werden standardmäßig als frei behandelt. ## Schutz vor Schleifen und Duplikaten [Abschnitt betitelt „Schutz vor Schleifen und Duplikaten“](#schutz-vor-schleifen-und-duplikaten) Kalender Sync markiert jeden selbst erstellten Blocker und synchronisiert ihn **nie weiter** — es entsteht kein Ping-Pong zwischen gekoppelten Kalendern und keine Duplikate, auch nicht in [Ketten-Setups](/sync/multi-account-setups/) über drei und mehr Kalender. ## Beim Pausieren und Beenden [Abschnitt betitelt „Beim Pausieren und Beenden“](#beim-pausieren-und-beenden) * **Pausiert**: Der Sync stoppt, bestehende Blocker bleiben stehen. Beim Fortsetzen wird der Stand abgeglichen. * **Beendet**: Alle von Kalender Sync erstellten Blocker im Ziel werden **automatisch aufgeräumt**. Details: [Sync pausieren oder beenden](/sharings/pause-end/). # Mehrere Konten & Ketten-Setups > Stern, Kette oder Kreuz — wie komplexe Setups über mehrere Kalender sauber funktionieren. Mit mehreren verbundenen Konten kannst du Syncs beliebig kombinieren — Kalender Sync sorgt dafür, dass dabei keine Schleifen oder Duplikate entstehen. ## Typische Setups [Abschnitt betitelt „Typische Setups“](#typische-setups) **Stern — einer blockt viele:** ```text Privat ──→ Arbeitskalender A Privat ──→ Arbeitskalender B ``` Ein Sync pro Ziel. **Bündel — mehrere Quellen blocken ein Ziel:** ```text Privat ──┐ Verein ──┼──→ Arbeitskalender Familie ─┘ ``` Dafür reicht **ein** Sync mit [mehreren Quellkalendern](/sharings/multiple-sources/) — alle Belegungen landen gebündelt im Ziel. **Kreuz — zwei Kalender blocken sich gegenseitig:** ```text Arbeit ⇄ Privat ``` Das ist ein [Zwei-Wege-Sync](/sharings/self-sync/) — er zählt fürs Plan-Limit als **ein** Sync. **Kette / Hub — alles läuft in einem Kalender zusammen:** ```text iCloud ──→ Outlook ──→ Google ``` Outlook ist hier der „Hub”: Er empfängt aus iCloud und speist gleichzeitig Google. Auch solche Ketten sind ausdrücklich erlaubt. ## Warum das sicher ist [Abschnitt betitelt „Warum das sicher ist“](#warum-das-sicher-ist) Kalender Sync markiert jeden selbst erstellten Blocker und **synchronisiert ihn nie weiter**: * Kein Ping-Pong: Beim Kreuz-Setup wandert ein Termin von A nach B — aber der Blocker in B wird nicht zurück nach A gespiegelt. * Keine Lawinen: In der Kette erzeugt der iCloud-Termin einen Blocker in Outlook, aber dieser Blocker fließt **nicht** weiter nach Google. Soll der Termin auch Google blocken, lege einen direkten Sync iCloud → Google an. * **Nicht möglich** ist nur ein Kalender als Quelle *und* Ziel desselben Syncs (A → A). ## Tipps für die Planung [Abschnitt betitelt „Tipps für die Planung“](#tipps-für-die-planung) * Skizziere zuerst, **wer wen blocken soll** — pro Pfeil ein Sync (ein Doppelpfeil = ein Zwei-Wege-Sync). * Blocker sollen nicht weitergereicht werden (siehe oben) — plane also **direkte** Syncs von jeder Quelle zu jedem Ziel, statt auf Ketten-Weiterleitung zu hoffen. * Die Anzahl an Konten und Syncs hängt von deinem Plan ab → [Pläne & Limits](/account-billing/plans-limits/). * Für Zwei-Wege-Syncs brauchst du **genau zwei beschreibbare** Kalender (iCal-Feeds sind z. B. nur lesbar und können kein Ziel sein). # Platzhalter-Titel anpassen > Den Standard-Titel der Blocker-Termine durch einen eigenen Text ersetzen. Bei der Sichtbarkeitsstufe **„Nur belegt”** tragen die Blocker im Zielkalender einen neutralen Standard-Titel („Geblockt”). Wenn dir das zu generisch ist, setzt du pro Sync einen eigenen **Platzhalter-Titel**. ## So funktioniert’s [Abschnitt betitelt „So funktioniert’s“](#so-funktionierts) 1. Beim Einrichten des Syncs im Schritt **„Sichtbarkeit”** die Stufe **„Nur belegt”** wählen. 2. Darunter erscheint das Feld **„Platzhalter-Titel”** (optional) — z. B. „Termin”, „Privat” oder „Extern” eintragen. 3. Alle Blocker dieses Syncs tragen künftig diesen Titel. Bei anderen Sichtbarkeitsstufen gibt es kein Platzhalter-Feld — dort wird ja der echte Terminname übertragen. ## Wofür ein eigener Titel nützlich ist [Abschnitt betitelt „Wofür ein eigener Titel nützlich ist“](#wofür-ein-eigener-titel-nützlich-ist) * **Mehrere Syncs in denselben Zielkalender**: „Privat” und „Nebenprojekt” lassen sich unterscheiden, „Geblockt” und „Geblockt” nicht. * **Kontext für die Empfängerseite**, ohne Details preiszugeben: „Extern gebucht” sagt genug. * **Beim Zwei-Wege-Sync** kannst du den Titel pro Richtung anders setzen. ## Nachträglich ändern [Abschnitt betitelt „Nachträglich ändern“](#nachträglich-ändern) Der Platzhalter-Titel lässt sich jederzeit **nachträglich ändern**: Drei-Punkte-Menü der Freigabe → **„Bearbeiten”** — die Blocker im Zielkalender werden automatisch mit dem neuen Titel neu geschrieben → [Freigabe bearbeiten](/sync/freigabe-bearbeiten/). # Wiederkehrende Termine > Wie Serientermine synchronisiert werden — inklusive Ausnahmen, Verschiebungen und Serienende. Serientermine (täglich, wöchentlich, monatlich …) werden vollständig synchronisiert — jede Wiederholung blockt die richtige Zeit im Ziel, und Änderungen an der Serie ziehen automatisch nach. ## Was zuverlässig funktioniert [Abschnitt betitelt „Was zuverlässig funktioniert“](#was-zuverlässig-funktioniert) * **Jede Wiederholung blockt korrekt** — mit Titel und Details gemäß deiner [Sichtbarkeitsstufe](/sync/visibility-levels/). * **Ausnahmen**: Fällt eine einzelne Instanz aus oder wird verschoben, spiegelt sich das im Ziel wider. * **Serienänderungen**: Änderst du die ganze Serie in der Quelle (z. B. neuer Wochentag), werden die Blocker entsprechend aktualisiert. * **Serienende**: Endet oder löschst du die Serie, verschwinden die Blocker. ## Wiederholungen in der fernen Zukunft [Abschnitt betitelt „Wiederholungen in der fernen Zukunft“](#wiederholungen-in-der-fernen-zukunft) Blocker existieren für Wiederholungen innerhalb des [Sync-Zeitfensters](/sync/sync-window/) (bis 6 Monate voraus, im Professional-Plan 18 Monate). Weitere Wiederholungen erscheinen **automatisch**, sobald sie ins Fenster rücken — eine endlose Wochenserie füllt das Ziel also nie bis ins Jahr 2030. ## Eine Wiederholung fehlt? [Abschnitt betitelt „Eine Wiederholung fehlt?“](#eine-wiederholung-fehlt) Meist eine Frage des Zeitfensters oder der Sync-Latenz → [Termin fehlt, doppelt oder verspätet](/troubleshooting/event-missing-or-duplicate/). Bleibt es dabei, [melde dich](/troubleshooting/contact-support/) mit einem Beispieltermin. # Präfix im Zielkalender > Synchronisierte Termine mit einem Titel-Präfix kennzeichnen, z. B. „Arbeit: Besprechung". Wenn mehrere Kalender in denselben Zielkalender synchronisieren, sieht man einem Termin nicht an, woher er stammt. Mit dem **Präfix im Zielkalender** bekommt jeder synchronisierte Termin einen kurzen Zusatz vor dem Titel — aus „Besprechung” wird z. B. **„Arbeit: Besprechung”**. ## So funktioniert’s [Abschnitt betitelt „So funktioniert’s“](#so-funktionierts) 1. Beim Einrichten des Syncs im Schritt **„Sichtbarkeit”** die Stufe **„Titel + Zeit”** oder **„Alle Details”** wählen. 2. Die Option **„Präfix im Zielkalender anzeigen”** aktivieren. 3. Ein kurzes Präfix eintragen — z. B. „Arbeit”, „Privat” oder den Namen der Kanzlei. Bei mehreren Quellkalendern kannst du pro Kalender ein eigenes Präfix setzen. 4. Die Sync-Vorschau rechts zeigt sofort, wie die Termine im Zielkalender aussehen werden. ![Sichtbarkeits-Schritt im Sync-Assistenten mit aktivierter Option „Präfix im Zielkalender anzeigen“ und Präfix „Arbeit“; die Sync-Vorschau zeigt den Termin „Arbeit: Mandantentermin“ im Zielkalender](/images/app/de/prefix-one-way.webp) Ein-Wege-Sync: Präfix „Arbeit“ aktiviert — die Sync-Vorschau rechts zeigt „Arbeit: Mandantentermin“ im Zielkalender. Beim **Zwei-Wege-Sync** setzt du das Präfix pro Richtung — z. B. „Arbeit” für Termine, die in den Privatkalender geschrieben werden, und „Privat” für die Gegenrichtung. ![Sichtbarkeit je Richtung beim Zwei-Wege-Sync: Präfix „Arbeit“ für die Richtung Arbeit → Privat und Präfix „Privat“ für die Gegenrichtung; die Sync-Vorschau zeigt beide Präfixe](/images/app/de/prefix-two-way.webp) Zwei-Wege-Sync: eigenes Präfix pro Richtung — im Privat-Kalender landet „Arbeit: Mandantentermin“, im Arbeits-Kalender „Privat: Teammeeting“. ## Regeln im Detail [Abschnitt betitelt „Regeln im Detail“](#regeln-im-detail) * **Format**: `Präfix: Terminname`, das Präfix darf bis zu **30 Zeichen** lang sein. * **Länge**: Wird der kombinierte Titel länger als **250 Zeichen**, kürzen wir ihn am Ende mit „…” — sonst lehnen manche Kalender (v. a. Outlook) den Termin ab. * **Sichtbarkeit**: Das Präfix steht im Termintitel und ist damit für **alle sichtbar**, die den Zielkalender sehen können. * **Bei „Nur belegt” gibt es kein Präfix** — dort übernimmt der [Platzhalter-Titel](/sync/placeholder-title/) diese Rolle. * **Fester Text**: Das Präfix ist ein eigener Text, kein Live-Verweis auf den Kalendernamen. Wenn du den Quellkalender später umbenennst, bleibt das Präfix unverändert — so sehen alle Termine einheitlich aus. * Funktioniert mit allen Anbietern (Google, Microsoft, Apple/CalDAV, iCal-Feeds als Quelle). ## Nachträglich ändern [Abschnitt betitelt „Nachträglich ändern“](#nachträglich-ändern) Das Präfix lässt sich jederzeit nachträglich setzen, ändern oder entfernen: im Dashboard über das Drei-Punkte-Menü der Freigabe → **„Bearbeiten“**. Die bereits synchronisierten Termine im Zielkalender werden automatisch mit dem neuen Präfix neu geschrieben → [Freigabe bearbeiten](/sync/freigabe-bearbeiten/). # Sync-Zeitfenster > Warum Termine in einem Zeitfenster synchronisiert werden — 3 Monate zurück für alle, voraus je nach Plan 6 oder 18 Monate. Kalender Sync synchronisiert Termine in einem Zeitfenster: **3 Monate in die Vergangenheit** für alle — **in die Zukunft abhängig vom Plan: 6 Monate (Free & Basic) bzw. 18 Monate (Professional)**. Beim Einrichten eines Syncs wird dir das als Zeitstrahl angezeigt. Das Fenster wandert täglich mit. ## Warum ein Zeitfenster? [Abschnitt betitelt „Warum ein Zeitfenster?“](#warum-ein-zeitfenster) * **Datensparsamkeit**: Termine von vor zwei Jahren blocken niemanden mehr — sie zu übertragen wäre unnötige Datenverarbeitung. * **Performance**: Auch sehr volle Kalender (tausende Termine) bleiben flott synchronisiert. ## Was das praktisch bedeutet [Abschnitt betitelt „Was das praktisch bedeutet“](#was-das-praktisch-bedeutet) * Ein Termin **in 8 Monaten**: Im Free- und Basic-Plan fehlt er zunächst im Ziel — das ist normal. Sobald er in das 6-Monats-Fenster rückt, erscheint er **automatisch**, du musst nichts tun. Im Professional-Plan ist er bereits synchronisiert, weil er im 18-Monats-Fenster liegt. * **Alte Termine** (älter als 3 Monate) werden nicht übertragen — beim Erstsync wundert das manchmal („wo ist letztes Jahr?”), ist aber gewollt. * Bei [Serienterminen](/sync/recurring-events/) existieren im Ziel die Wiederholungen innerhalb des Fensters; weitere kommen automatisch nach. ## Lässt sich das Fenster ändern? [Abschnitt betitelt „Lässt sich das Fenster ändern?“](#lässt-sich-das-fenster-ändern) Der Professional-Plan erweitert das Fenster in die Zukunft bereits auf **18 Monate** — für Buchungen weit im Voraus (z. B. 9 Monate) ist das der direkte Weg. Ein frei konfigurierbares Zeitfenster pro Sync bleibt darüber hinaus geplant ([Bekannte Einschränkungen](/troubleshooting/known-limitations/)). Wenn dich ein konkreter Fall blockiert, [schreib uns](/troubleshooting/contact-support/) — das hilft uns beim Priorisieren. # Sichtbarkeitsstufen > Nur belegt, Titel + Zeit oder volle Details — was beim Sync übertragen wird und was nie. Pro Sync legst du fest, wie viel die Empfängerseite von deinen Terminen sieht. Das ist das Herzstück des Datenschutz-Konzepts: Du teilst **Verfügbarkeit**, nicht zwangsläufig Inhalte. ![Sichtbarkeits-Schritt mit den Stufen Nur belegt, Titel + Zeit und Alle Details samt Vorschau](/images/app/de/wizard-visibility.webp) Die Auswahl beim Erstellen — die Vorschau rechts zeigt live, was ankommt. ## Die drei Stufen [Abschnitt betitelt „Die drei Stufen“](#die-drei-stufen) | Stufe | Was im Ziel ankommt | Typischer Einsatz | | ------------------------- | --------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | | **Nur belegt** (Standard) | Nur der Zeitraum, als Titel „Geblockt” oder dein [Platzhalter-Text](/sync/placeholder-title/) | Privates blockt den Arbeitskalender — maximale Privatsphäre | | **Titel + Zeit** | Terminname sowie Start- und Endzeit | Eigene Kalender koppeln, enge Team-Koordination | | **Alle Details** | Inkl. Ort, Beschreibung, Notizen und Links | Assistenz, gemeinsame Terminverwaltung | Beim [Zwei-Wege-Sync](/sharings/self-sync/) kannst du die Stufe **pro Richtung** unterschiedlich wählen. ## Was nie übertragen wird [Abschnitt betitelt „Was nie übertragen wird“](#was-nie-übertragen-wird) Unabhängig von der Stufe bleiben außen vor: * **Teilnehmerlisten und deren E-Mail-Adressen** — das sind Daten Dritter * **Organisator:innen** und **Zu-/Absage-Status** * Anhänge Mehr zum Datenschutz-Konzept: [Sicherheit & Datenschutz im Überblick](/privacy-it/security-overview/). ## Festlegen und ändern [Abschnitt betitelt „Festlegen und ändern“](#festlegen-und-ändern) Die Stufe wählst du **beim Einrichten** des Syncs im Schritt „Sichtbarkeit” — und kannst sie jederzeit **nachträglich ändern**: Drei-Punkte-Menü der Freigabe → **„Bearbeiten”**. Die Kopien im Zielkalender werden automatisch mit der neuen Stufe neu geschrieben → [Freigabe bearbeiten](/sync/freigabe-bearbeiten/). ## Welche Stufe für welchen Fall? [Abschnitt betitelt „Welche Stufe für welchen Fall?“](#welche-stufe-für-welchen-fall) * **Im Zweifel: „Nur belegt”.** Es erfüllt den Hauptzweck — keine Doppelbuchungen — ohne irgendetwas preiszugeben. Hochstufen kannst du immer noch. * **„Titel + Zeit”**, wenn die Gegenseite wissen soll, *was* dich blockt (z. B. deine eigenen zwei Kalender oder ein enges Team). * **„Alle Details”** nur, wenn die Empfängerseite mit deinen Terminen *arbeiten* muss (Assistenz, Co-Founder). # Verbindung schlägt fehl > Ein Kalender lässt sich nicht verbinden — schnelle Triage der häufigsten Ursachen. Das Verbinden eines Kalenderkontos bricht ab oder endet mit einer Fehlermeldung? Hier die schnelle Triage. ## Nach Fehlerbild [Abschnitt betitelt „Nach Fehlerbild“](#nach-fehlerbild) | Du siehst … | Ursache & Lösung | | --------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | „Zustimmung des Administrators erforderlich” / „Need admin approval” (Microsoft) | Deine Organisation blockiert Dritt-Apps — der häufigste Fall → [drei Auswege](/connect-calendar/org-blocked/) | | „App blockiert” / „nicht vom Administrator überprüft” (Google Workspace) | Gleiches Thema auf Google-Seite → [drei Auswege](/connect-calendar/org-blocked/) | | „Anmeldung fehlgeschlagen” (Apple / KSuite) | Fast immer das falsche Passwort: Es braucht ein **app-spezifisches Passwort**, nicht dein normales → [Apple](/connect-calendar/apple-icloud/), [KSuite](/connect-calendar/ksuite/) | | „Feed konnte nicht hinzugefügt werden” (iCal) | URL prüfen: erreichbar? Wirklich eine `.ics`-/`webcal`-Adresse? Nur HTTPS wird akzeptiert → [iCal-Feed](/connect-calendar/ical-feed/) | | „Der Kalender konnte bei deinem Anbieter nicht angelegt werden” (beim Einrichten eines Syncs) | Der Anbieter — praktisch immer Infomaniak/KSuite — hat den neuen Zielkalender nicht übernommen. Kalender direkt beim Anbieter anlegen und im Assistenten als vorhandenen Kalender wählen → [KSuite-Anleitung](/connect-calendar/ksuite/) | | „Der Kalender ‚…‘ existiert bei deinem Anbieter nicht mehr” (beim Einrichten eines Syncs) | Der gewählte Kalender wurde beim Anbieter gelöscht, war aber noch in der Auswahl gelistet. Kalenderliste aktualisieren und einen anderen Kalender wählen | | Limit-Hinweis im Verbinden-Dialog | Konten-Limit deines Plans erreicht → [Pläne & Limits](/account-billing/plans-limits/) | ## Wenn der Login einfach „nicht durchgeht” [Abschnitt betitelt „Wenn der Login einfach „nicht durchgeht”“](#wenn-der-login-einfach-nicht-durchgeht) * **Falsches Konto erwischt**: Bei mehreren Google-/Microsoft-Konten im Browser genau auf die Kontoauswahl achten — im Zweifel privates Fenster. * **Berechtigung abgelehnt**: Wenn du im Consent-Dialog Häkchen entfernst oder ablehnst, bricht die Verbindung ab — Vorgang wiederholen und alles bestätigen ([warum die Berechtigungen nötig sind](/privacy-it/permissions/)). * **Pop-up-Blocker**: Das Anbieter-Fenster wird teils als Pop-up geöffnet — kurz erlauben und erneut versuchen. ## Verbindung steht, aber nichts passiert? [Abschnitt betitelt „Verbindung steht, aber nichts passiert?“](#verbindung-steht-aber-nichts-passiert) Dann ist es kein Verbindungs-, sondern ein Sync-Thema → [Sync funktioniert nicht — Checkliste](/troubleshooting/sync-not-working/) # Support kontaktieren > So erreichst du uns — und welche Angaben uns helfen, dir schnell zu helfen. Du kommst mit der Doku nicht weiter? Dann melde dich — wir sind ein kleines Team, dafür liest deine Nachricht direkt der Gründer. ## Kontaktwege [Abschnitt betitelt „Kontaktwege“](#kontaktwege) * **E-Mail**: * **Kontaktformular**: [kalender-sync.de/kontakt](https://kalender-sync.de/kontakt/) * **In der App**: Der **Feedback**-Button in der Seitenleiste — ideal für Bugs und Feature-Wünsche, die Nachricht landet direkt bei uns. ## Diese Angaben beschleunigen die Lösung [Abschnitt betitelt „Diese Angaben beschleunigen die Lösung“](#diese-angaben-beschleunigen-die-lösung) Je konkreter, desto schneller können wir helfen: * Die **E-Mail-Adresse deines Kontos** * Welcher **Sync** betroffen ist (Quelle → Ziel, Anbieter) * Ein **Beispieltermin**: Titel + Zeitpunkt, was du erwartet und was du beobachtet hast * **Seit wann** das Problem besteht; gern ein Screenshot der Fehlermeldung Achtung Bitte **niemals Passwörter oder App-Passwörter** mitschicken — wir fragen nie danach und brauchen sie nicht. ## Vorher kurz prüfen [Abschnitt betitelt „Vorher kurz prüfen“](#vorher-kurz-prüfen) Die zwei schnellsten Selbsthilfen: * [Sync funktioniert nicht — Checkliste](/troubleshooting/sync-not-working/) * [Bekannte Einschränkungen](/troubleshooting/known-limitations/) — vielleicht ist es schon dokumentiert (und geplant) # Termin fehlt, doppelt oder verspätet > Einzelne Termine verhalten sich unerwartet — Symptome und ihre Ursachen. Der Sync läuft grundsätzlich, aber einzelne Termine machen nicht mit? Hier die Symptome und ihre häufigsten Ursachen. (Kommt **gar nichts** an, starte mit der [Checkliste](/troubleshooting/sync-not-working/).) ## Ein Termin fehlt im Ziel [Abschnitt betitelt „Ein Termin fehlt im Ziel“](#ein-termin-fehlt-im-ziel) * **Außerhalb des Zeitfensters**: weiter in der Zukunft als dein Plan abdeckt (6 Monate bei Free & Basic, 18 Monate bei Professional) oder älter als 3 Monate → erscheint automatisch, sobald er ins [Fenster](/sync/sync-window/) rückt. * **Ganztägiger Termin**: wird standardmäßig als frei übertragen → [Ganztägige Termine](/sync/all-day-events/). * **Quelle nicht im Sync**: Liegt der Termin wirklich in einem der gewählten [Quellkalender](/sharings/multiple-sources/)? * **Polling-Verzögerung**: Bei Apple/KSuite/iCal-Quellen bis zu 5 Minuten warten. * **Wiederholung einer Serie**: erscheint erst, wenn sie ins Zeitfenster rückt → [Wiederkehrende Termine](/sync/recurring-events/). Tipp: Das [Sicherheitsnetz](/sync/how-it-works/#wie-schnell-ist-der-sync) gleicht alle paar Stunden komplett ab — vieles löst sich dadurch von selbst. ## Ein Termin kommt verspätet [Abschnitt betitelt „Ein Termin kommt verspätet“](#ein-termin-kommt-verspätet) * Google/Microsoft-Quellen: typisch unter einer Minute (in allen Plänen). Apple/KSuite/iCal: bis zu 5 Minuten plus ggf. Anbieter-Caching (Outlook-Feeds sind träge). * Dauerhaft langsamer? [Melde dich](/troubleshooting/contact-support/) mit einem konkreten Beispiel. ## Ein Termin erscheint doppelt [Abschnitt betitelt „Ein Termin erscheint doppelt“](#ein-termin-erscheint-doppelt) * **Zwei Syncs, ein Ziel**: Schreiben zwei Syncs denselben Quellkalender in denselben Zielkalender? Dann erzeugt jeder seinen eigenen Blocker — einen davon beenden. * **Alt-Blocker eines beendeten Syncs**: Das Aufräumen läuft im Hintergrund und kann Minuten bis Stunden dauern → [Beenden](/sharings/pause-end/). * Reproduzierbare echte Duplikate aus **einem** Sync sind ein Bug → [Support](/troubleshooting/contact-support/) mit Beispiel, wir schauen direkt nach. ## Ein Blocker bleibt stehen, obwohl der Quelltermin weg ist [Abschnitt betitelt „Ein Blocker bleibt stehen, obwohl der Quelltermin weg ist“](#ein-blocker-bleibt-stehen-obwohl-der-quelltermin-weg-ist) * Kurz warten: Löschungen kommen mit der nächsten Sync-Runde bzw. spätestens mit dem Sicherheitsnetz-Abgleich. * **Blocker von Hand gelöscht/verschoben?** Andersherum gilt: Von Kalender Sync erstellte Blocker werden beim nächsten Abgleich wiederhergestellt — sie gehören der Quelle. Termin loswerden → in der **Quelle** löschen. * Bleibt der Geister-Blocker dauerhaft: [Support](/troubleshooting/contact-support/) mit Titel + Zeitpunkt. # Häufige Fragen (FAQ) > Kurzantworten auf die häufigsten Fragen — mit Links zu den ausführlichen Artikeln. ## Sync & Termine [Abschnitt betitelt „Sync & Termine“](#sync--termine) **Wie schnell synchronisiert Kalender Sync?** In allen Plänen: Google/Microsoft nahezu sofort (Echtzeit-Webhook). Apple/KSuite/iCal (ab Basic): alle 5 Minuten. Dazu ein Sicherheitsnetz alle paar Stunden. → [Wie schnell ist der Sync?](/sync/how-it-works/#wie-schnell-ist-der-sync) **Werden meine Originaltermine verändert?** Nein, nie. Kalender Sync legt nur eigene Blocker im Zielkalender an und verwaltet ausschließlich diese. **Sehen andere meine Termindetails?** Nur was du erlaubst: „Nur belegt” (Standard), „Titel + Zeit” oder „Alle Details”. Teilnehmerdaten nie. → [Sichtbarkeitsstufen](/sync/visibility-levels/) **Warum fehlt ein Termin aus dem nächsten Jahr?** Synchronisiert wird −3 Monate bis +6 Monate (Free & Basic) bzw. +18 Monate (Professional); er erscheint automatisch, sobald er ins Fenster rückt. → [Sync-Zeitfenster](/sync/sync-window/) **Warum blockt mein Urlaub (ganztägig) nichts?** Ganztägige Termine werden standardmäßig als frei behandelt — umstellbar. → [Ganztägige Termine](/sync/all-day-events/) **Warum sind meine Terminfarben grau oder kommen nicht an?** Prüf zuerst, ob **„Terminfarben übernehmen“** im Sync eingeschaltet ist (ab Basic; bei „Nur belegt“ und bei Freigaben an andere ist es zunächst aus). Outlook zeigt neu angelegte Kategorien manchmal erst nach einigen Stunden farbig an. Verlangt Microsoft eine zusätzliche Erlaubnis, steht unter **„Bearbeiten“** der Button **„Erlaubnis erteilen“**. In iCloud-Zielkalendern gibt es keine Farben pro Termin, bei CalDAV entscheidet dein Kalenderprogramm, ob es die Farbe anzeigt. Ist ein Google-Zielkalender nur für dich freigegeben, kommt die ähnlichste der 11 klassischen Google-Farben an. → [Terminfarben übernehmen](/sync/event-colors/) ## Konten & Anbieter [Abschnitt betitelt „Konten & Anbieter“](#konten--anbieter) **Welche Kalender werden unterstützt?** Google, Microsoft/Outlook, Apple iCloud, GMX, WEB.DE, mailbox.org, Posteo, STRATO, Disroot, Infomaniak KSuite und iCal-Feeds (als Quelle). → [Kalender verbinden](/getting-started/connect-first-calendar/) **Meine Firma blockiert die Verbindung — was nun?** Drei Auswege: iCal-Feed (ab Basic), IT-Freigabe in 2 Minuten, oder App-Passwort/CalDAV bei iCloud, GMX, WEB.DE, mailbox.org, Posteo, STRATO, Disroot & KSuite. → [Organisation blockiert](/connect-calendar/org-blocked/) **Apple fragt nach einem Passwort — mein normales geht nicht?** Richtig: Es braucht ein app-spezifisches Passwort (2 Minuten erstellt). → [Apple iCloud](/connect-calendar/apple-icloud/) **Kann ich die Sichtbarkeit eines bestehenden Syncs ändern?** Über das Drei-Punkte-Menü der Freigabe → **„Bearbeiten“**: Quellen, Zielkalender, Sichtbarkeit, Platzhalter-Titel und Präfix lassen sich nachträglich ändern; die Kopien im Zielkalender werden automatisch neu geschrieben. → [Freigabe bearbeiten](/sync/freigabe-bearbeiten/) ## Konto & Bezahlung [Abschnitt betitelt „Konto & Bezahlung“](#konto--bezahlung) **Was passiert nach der Testphase?** Automatisch Free; überzählige Syncs werden pausiert. Bei Syncs eigener Kalender werden die kopierten Einträge nach 14 Tagen entfernt (deine Originale bleiben unberührt) — nach einem Upgrade wird alles aus deinen Originalkalendern wiederhergestellt. → [Testphase](/account-billing/trial/) **Wie kündige ich?** Selbst, unter Einstellungen → Abrechnung — wirksam zum Periodenende, vorher widerrufbar. → [Kündigung](/account-billing/upgrade-cancel/) **Wie lösche ich mein Konto samt Daten?** Selbst, unter Einstellungen → Daten — sofort und endgültig, inkl. Blocker-Aufräumen. → [Konto löschen](/account-billing/export-delete/) ## Datenschutz [Abschnitt betitelt „Datenschutz“](#datenschutz) **Wo werden meine Daten gespeichert?** In Deutschland (Hetzner) — und Termininhalte gar nicht. → [Sicherheit & Datenschutz](/privacy-it/security-overview/) **Gibt es einen AVV?** Ja, nach Art. 28 DSGVO — für alle Tarife bei geschäftlicher Nutzung inklusive, Bestandteil der AGB: [kalender-sync.de/avv](https://kalender-sync.de/avv/). → [AVV & Unterauftragnehmer](/privacy-it/dpa-subprocessors/) Deine Frage ist nicht dabei? Nutze die **Suche** oben — oder [frag uns direkt](/troubleshooting/contact-support/). # Bekannte Einschränkungen > Was Kalender Sync (noch) nicht kann — transparent dokumentiert, mit Status. Wir dokumentieren Einschränkungen lieber offen, als dass du sie im Support erfragen musst. Was dich davon konkret blockiert, [sag uns gern](/troubleshooting/contact-support/) — das fließt direkt in die Priorisierung. *(Stand: Juli 2026)* ## Aktuelle Einschränkungen [Abschnitt betitelt „Aktuelle Einschränkungen“](#aktuelle-einschränkungen) | Einschränkung | Details | Status | | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------- | | **Zwei-Wege-Sync: Kalender-Paar fest** | Optionen (Sichtbarkeit, Präfix, …) sind pro Richtung [bearbeitbar](/sync/freigabe-bearbeiten/); die beiden Kalender selbst lassen sich nicht tauschen — dafür beenden + neu anlegen | — | | **Sync-Zeitfenster nicht frei wählbar** | −3 Monate zurück für alle; voraus +6 Monate (Free & Basic) bzw. +18 Monate (Professional) → [Details](/sync/sync-window/) | Frei konfigurierbar geplant | | **Kein iCal-Export** | Kalender Sync kann Feeds **lesen**, aber noch keine eigene Feed-URL zum Abonnieren erzeugen — relevant für [blockierte Organisationen](/connect-calendar/org-blocked/) | Geplant | | **E-Mail-Adresse nicht änderbar** | Die Adresse ist der Konto-Anker → [Workaround über den Support](/account-billing/profile-notifications/) | Geplant | | **5-Minuten-Rhythmus bei Apple/KSuite/iCal** | Technische Grenze dieser Anbieter (kein Push) — Google/Microsoft laufen in allen Plänen nahezu sofort | Bleibt vorerst | | **Keine Team-/Organisationskonten** | Jede:r Nutzer:in hat ein eigenes Konto; zentrale Verwaltung und Sammelabrechnung gibt es noch nicht | Auf der Roadmap | ## Feature-Wünsche [Abschnitt betitelt „Feature-Wünsche“](#feature-wünsche) Was als Nächstes kommt, steht auf der öffentlichen [Roadmap](https://kalender-sync.de/roadmap/) — dort kannst du auch abstimmen und Wünsche einreichen. # Anmeldeprobleme > Code kommt nicht an, Code ungültig, kein Zugriff mehr aufs Postfach — die Lösungen. Der Login läuft über deine E-Mail-Adresse — per 6-stelligem Code, Passwort oder Google/Microsoft ([alle Wege erklärt](/getting-started/create-account/)). Hier die häufigsten Hänger. ## „Die Code-E-Mail kommt nicht an” [Abschnitt betitelt „„Die Code-E-Mail kommt nicht an”“](#die-code-e-mail-kommt-nicht-an) * **Spam-/Junk-Ordner** prüfen — gerade beim ersten Mal landet die Mail dort gern. * **1–2 Minuten Geduld**: Manche Firmen-Postfächer (Sicherheits-Gateways, Quarantäne) stellen verzögert zu. * **Tippfehler** in der E-Mail-Adresse? Einfach neu anfordern. * Kommt dauerhaft nichts an: mit einer privaten Adresse testen — klappt es dort, hängt es am Firmen-Mailserver (IT fragen oder [Support kontaktieren](/troubleshooting/contact-support/)). ## „Code ungültig” oder „Code abgelaufen” [Abschnitt betitelt „„Code ungültig” oder „Code abgelaufen”“](#code-ungültig-oder-code-abgelaufen) * Codes sind **15 Minuten** gültig — danach einfach einen neuen anfordern. * Mehrere Mails bekommen? Es zählt immer der Code aus der **neuesten**. * Nach **5 falschen Eingaben** wird der Code entwertet („Zu viele Versuche”) — auch hier: neuen Code anfordern, kurz warten, falls das Anfordern selbst gebremst wird. ## „Passwort vergessen” [Abschnitt betitelt „„Passwort vergessen”“](#passwort-vergessen) Auf der Login-Seite **„Passwort vergessen?”** wählen — du setzt es per E-Mail-Code neu. Oder melde dich einfach gleich **„Lieber per Code”** an, ganz ohne Passwort. ## „Mit Google/Microsoft anmelden geht nicht” [Abschnitt betitelt „„Mit Google/Microsoft anmelden geht nicht”“](#mit-googlemicrosoft-anmelden-geht-nicht) * Gleiche E-Mail-Adresse wie bei der Registrierung? Die Anmeldewege führen nur dann ins selbe Konto. * Fehlermeldung im Anbieter-Login (Org-Richtlinie)? Dann nutze den E-Mail-Code-Login — der funktioniert immer. ## „Ich komme nicht mehr an mein Postfach” [Abschnitt betitelt „„Ich komme nicht mehr an mein Postfach”“](#ich-komme-nicht-mehr-an-mein-postfach) Ohne Zugriff auf deine E-Mail-Adresse können wir dich nicht automatisch verifizieren — [kontaktiere den Support](/troubleshooting/contact-support/), wir finden gemeinsam einen Weg. ## Kein Passwortfeld beim Verbinden eines Assistenten [Abschnitt betitelt „Kein Passwortfeld beim Verbinden eines Assistenten“](#kein-passwortfeld-beim-verbinden-eines-assistenten) Im vereinfachten OAuth-Test meldest du dich mit Google, Microsoft oder einem E-Mail-Code an. Das gilt auch, wenn du bereits ein Passwort hast. Beim normalen App-Login bleibt dein Passwort gültig. Wenn kein Code ankommt, prüfe die E-Mail-Adresse und den Spam-Ordner; fordere nach Ablauf der Wartezeit einen neuen Code an. # „Bitte neu verbinden" — Verbindung abgelaufen > Warum eine Kalender-Verbindung abläuft und wie du sie in einer Minute erneuerst. Zeigt ein Kalenderkonto im Dashboard **„Bitte neu verbinden”** (du bekommst dazu auch eine E-Mail), ist der Zugriff auf den Anbieter abgelaufen oder wurde widerrufen. Der Sync pausiert so lange — **es geht nichts verloren.** ## So verbindest du neu [Abschnitt betitelt „So verbindest du neu“](#so-verbindest-du-neu) 1. Im Dashboard beim betroffenen Konto auf **„Erneut verbinden”** klicken. 2. Den Anbieter-Login durchlaufen (bzw. bei Apple/KSuite das App-Passwort neu eingeben — ggf. vorher ein [neues erstellen](/connect-calendar/apple-icloud/)). 3. Fertig — der Sync holt automatisch alles nach, was sich zwischenzeitlich geändert hat. **Externe Freigabe?** Liegt der Zielkalender im Konto des Empfängers, muss **der Empfänger** sein Konto in seinem eigenen Kalender-Sync-Zugang neu verbinden. Der Absender sieht an der Freigabe den Status **„Reauth nötig”**, kann das Konto aber nicht selbst reparieren. ## Warum passiert das? [Abschnitt betitelt „Warum passiert das?“](#warum-passiert-das) * Du hast beim Anbieter das **Passwort geändert** oder den Zugriff **manuell widerrufen**. * Eine **Sicherheitsrichtlinie deiner Organisation** hat die Zugriffe zurückgesetzt. * Das **App-Passwort** (Apple/KSuite) wurde gelöscht oder ist abgelaufen. ## Es klappt trotzdem nicht? [Abschnitt betitelt „Es klappt trotzdem nicht?“](#es-klappt-trotzdem-nicht) * Fehlermeldung **im Anbieter-Login** („Zustimmung des Administrators erforderlich” o. Ä.) → [Meine Organisation blockiert die Verbindung](/connect-calendar/org-blocked/) * Andere Verbindungsfehler → [Verbindung schlägt fehl](/troubleshooting/connection-fails/) # Sync funktioniert nicht — Checkliste > Schritt für Schritt zur Ursache, wenn keine Termine ankommen — nach Häufigkeit sortiert. Es kommt nichts an? Geh diese Punkte der Reihe nach durch — sie sind nach Häufigkeit sortiert, meist ist es einer der ersten drei. ## Die Checkliste [Abschnitt betitelt „Die Checkliste“](#die-checkliste) 1. **Erstsync noch nicht fertig?** Die erste Synchronisation kann je nach Terminanzahl einige Minuten bis zu einer halben Stunde dauern — du bekommst eine E-Mail, sobald sie durch ist. 2. **Verbindung in Ordnung?** Zeigt ein Kalenderkonto im Dashboard „Bitte neu verbinden”? Dann pausiert der Sync, bis du neu verbindest → [Verbindung abgelaufen](/troubleshooting/reconnect/) 3. **Sync pausiert?** Status im Dashboard prüfen — auch automatische Pausen durch [Trial-Ende oder Plan-Limit](/account-billing/trial/) (erkennbar am Schloss-Symbol). 4. **Einladung noch nicht angenommen?** Status „Ausstehend” heißt: Die Empfängerseite hat noch nicht angenommen — es wird noch nichts synchronisiert. Den Einladungslink kannst du im Dashboard erneut kopieren. 5. **Termin außerhalb des Zeitfensters?** Synchronisiert wird nur **3 Monate in die Vergangenheit; in die Zukunft abhängig vom Plan: 6 Monate (Free & Basic) bzw. 18 Monate (Professional)** → [Sync-Zeitfenster](/sync/sync-window/) 6. **Nur Geduld nötig?** Apple, KSuite und iCal-Feeds syncen **alle 5 Minuten**, nicht sekundenschnell → [Wie schnell ist der Sync?](/sync/how-it-works/#wie-schnell-ist-der-sync) 7. **Im richtigen Kalender nachgeschaut?** Gerade bei mehreren Konten: Ist das Ziel wirklich der Kalender, in den du gerade schaust? Wurde beim Annehmen ein **neuer** Kalender erstellt, muss der in deiner Kalender-App ggf. erst eingeblendet werden. 8. **Ganztägiger Termin?** Die werden standardmäßig **als frei** übertragen — und blocken nichts → [Ganztägige Termine](/sync/all-day-events/) ## Einzelne Termine fehlen oder doppelt? [Abschnitt betitelt „Einzelne Termine fehlen oder doppelt?“](#einzelne-termine-fehlen-oder-doppelt) Wenn der Sync grundsätzlich läuft, aber sich einzelne Termine seltsam verhalten → [Termin fehlt, doppelt oder verspätet](/troubleshooting/event-missing-or-duplicate/). ## Immer noch nichts? [Abschnitt betitelt „Immer noch nichts?“](#immer-noch-nichts) [Schreib uns](/troubleshooting/contact-support/) — am schnellsten geht’s mit Angabe des betroffenen Syncs, einem Beispieltermin (Titel + Zeitpunkt) und seit wann das Problem besteht.