> ## Documentation Index
> Fetch the complete documentation index at: https://docs.famulor.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Kalender & Buchung

> Verfügbarkeit prüfen und Termine mitten im Anruf buchen – über Acuity Scheduling, Cal.com, Calendly, eTermin, HighLevel oder die integrierte Engine

Terminplanung ist der klassische Anwendungsfall für einen Voice-Agenten: Der Assistent prüft während des Anrufs freie Termine, bietet ein paar Optionen an und bucht den, für den sich der Anrufer entscheidet. Die Plattform unterstützt das auf zwei Arten, die sich frei kombinieren lassen:

1. **Calendar integrations** – verbinde einmal einen externen Planungsanbieter (Acuity Scheduling, Cal.com, Calendly, eTermin, HighLevel), weise ihn einem Assistenten zu, und der Assistent bekommt automatisch Buchungstools für jeden Anruf. Google Calendar und Outlook verbindest du an derselben Stelle, sie speisen aber den Kalender-Sync der integrierten Engine, statt mitten im Anruf zu buchen – siehe den Hinweis unter der Tabelle.
2. **Die integrierte Buchungs-Engine** – definiere eigene Event-Typen mit wöchentlicher Verfügbarkeit und erhalte eine öffentliche, einbettbare Buchungsseite unter `/book/{workspace}/{slug}`, ICS-Einladungs-E-Mails und eine `native`-Integration, über die deine Assistenten buchen können. Kein externes Konto nötig. Mehr dazu unter [Integrierter Kalender](/de/assistants/native-calendar).

## Anbieter im Überblick

| Anbieter                        | Verfügbarkeit                                                          | Buchung                                                                                   | Zugangsdaten                                                                                                          |
| ------------------------------- | ---------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| **Cal.com**                     | ✓ offene Slots eines Event-Typs                                        | ✓ Direktbuchung                                                                           | API-Key (`cal_…`) + API-Endpunkt (US, EU oder selbst gehostet), Event-Typ aus einer synchronisierten Liste ausgewählt |
| **Calendly**                    | ✓ verfügbare Zeiten eines ausgewählten Event-Typs                      | ✓ Direktbuchung (kostenpflichtige Calendly-Pläne), Einmal-Buchungslink, bestätigte Absage | OAuth-Verbindung (einmalig)                                                                                           |
| **Acuity Scheduling**           | ✓ Live-Slots oder Kursverfügbarkeit für einen ausgewählten Termintyp   | ✓ Direktbuchung, bestätigte Absage und Umbuchung (Serien können nicht verschoben werden)  | OAuth-Verbindung (einmalig)                                                                                           |
| **eTermin**                     | ✓ Live-Slots für einen ausgewählten Service + Kalender/Person          | ✓ Direktbuchung                                                                           | Public Key + Secret Key (Account Settings → API), Service und Kalender/Person aus synchronisierten Listen ausgewählt  |
| **HighLevel**                   | ✓ live freie Slots eines ausgewählten Kalenders                        | ✓ Direktbuchung                                                                           | Eine bestehende HighLevel-Verbindung (aus Automations → Connections) + Kalender                                       |
| **Google Calendar**             | ✓ Frei/Gebucht eines verbundenen Kalenders, für die integrierte Engine | ✓ Termin-Erstellung mit Teilnehmereinladung, über die integrierte Engine                  | OAuth-Verbindung (einmalig)                                                                                           |
| **Outlook / Microsoft 365**     | ✓ Frei/Gebucht eines verbundenen Kalenders, für die integrierte Engine | ✓ Termin-Erstellung mit Teilnehmereinladung, über die integrierte Engine                  | OAuth-Verbindung (einmalig)                                                                                           |
| **Native (integrierte Engine)** | ✓ berechnet aus der wöchentlichen Verfügbarkeit deines Event-Typs      | ✓ Direktbuchung + ICS-E-Mail                                                              | keine – siehe [Integrierter Kalender](/de/assistants/native-calendar)                                                 |

<Note>
  **Google Calendar und Outlook sind Sync-Ziele, keine Buchungsanbieter für mitten im Anruf.** Ihre Verbindung macht ihre Belegungszeiten und Terminerstellung für die [integrierte Buchungs-Engine](/de/assistants/native-calendar#die-integrierte-buchungs-engine) verfügbar; Assistenten können sie während eines Gesprächs noch nicht direkt aufrufen. Um mitten im Anruf auf diesen Kalendern zu buchen, stelle entweder einen Cal.com-, Calendly-, Acuity- oder HighLevel-Event-Typ davor, oder verwende einen integrierten Event-Typ mit aktiviertem Kalender-Sync.
</Note>

<Note>
  **Calendly-Link-Modus**: Die Scheduling-API von Calendly setzt einen kostenpflichtigen Calendly-Plan voraus. Wenn dein Plan nicht direkt buchen kann, setze `booking_mode` der Integration auf `link` – der Assistent einigt sich dann mit dem Anrufer auf eine ungefähre Zeit und schickt statt einer festen Buchung einen **Einmal-Buchungslink** per SMS oder E-Mail (`link_channel`). Integrationen, die während des Anrufs an diese Plan-Beschränkung stoßen, werden mit dem Status `link_mode` markiert.
</Note>

## Eine Integration verbinden

Gehe zu **Booking → Integrations** und wähle eine Anbieter-Karte:

<Tabs>
  <Tab title="Cal.com">
    Füge deinen API-Key ein (Cal.com → Settings → Developer → API Keys) und wähle den **API endpoint**: US (Standard), EU oder Custom für eine selbst gehostete Cal.com-Instanz. Wähle **Load event types**, um deine Events nach Name und Dauer abzurufen – du musst keine numerische ID aus der URL kopieren. Die Integration liest außerdem automatisch die benutzerdefinierten Buchungsfragen des Event-Typs; nutze **Refresh fields**, wenn du sie später in Cal.com änderst. Optionale Zeitzonen-Überschreibung – achte darauf, dass sie zum Cal.com-Event-Typ passt.
  </Tab>

  <Tab title="Calendly">
    Klicke auf **Connect with Calendly**, bestätige den Zugriff und wähle dann einen aktiven Event-Typ nach **Name und Dauer**. Eine Kontoverbindung kann von mehreren Integrationen wiederverwendet werden. Hat der Event-Typ in Calendly mehr als einen konfigurierten Ort, wählst du unter **Meeting location**, welchen der Assistent nutzen soll. Lege Buchungsmodus, Link-Kanal und Book-/Cancel-Berechtigungen fest.
  </Tab>

  <Tab title="Acuity Scheduling">
    Klicke auf **Connect with Acuity**, bestätige den Zugriff und wähle dann einen Termintyp. Optional wählst du einen bestimmten Kalender oder eine Person, oder lässt den Dienst einen beliebigen verfügbaren Kalender wählen. Aktiviere oder deaktiviere Book, Cancel und Reschedule für jede Integration.
  </Tab>

  <Tab title="eTermin">
    Füge deinen **Public Key** und **Secret Key** ein (eTermin → Account Settings → API) und wähle dann **Load services**, um deine Services nach Name und Dauer abzurufen. Die Auswahl eines Service lädt nur die Kalender/Personen, die eTermin dafür anbietet – wähle eine aus und passe die Dauer an, falls sie vom Service-Standard abweichen muss. Nachdem die Integration gespeichert ist, erscheint eine **Web Push URL**: Füge sie in eTermins Einstellungen unter **API → API & Web Push** ein (aktiviere **Send Web Push**, bevorzugt im JSON-Format), damit eTermin die Plattform benachrichtigt, sobald auf seiner Seite ein Termin erstellt, geändert oder storniert wird. Der Editor zeigt danach an, wann das letzte Ereignis eingetroffen ist – der schnellste Weg zu prüfen, ob die Verbindung live ist. Auf beiden Seiten lässt sich optional ein Shared Secret festlegen, das als `X-Webhook-Secret`-Header geprüft wird.
  </Tab>

  <Tab title="HighLevel">
    Verbinde zuerst ein HighLevel-Konto unter **Automations → Connections**, falls noch nicht geschehen. Wähle dann zurück in **Booking → Integrations** die Option **Connect HighLevel**, wähle diese Verbindung aus und dann einen ihrer aktiven Kalender. Die Umschalter Book, Cancel und Reschedule werden pro Integration gespeichert, aber Assistenten bekommen für HighLevel derzeit nur Verfügbarkeit und Buchung – ein Cancel- oder Reschedule-Tool für HighLevel gibt es noch nicht.
  </Tab>

  <Tab title="Google / Outlook">
    Klicke auf **Connect** und schließe die OAuth-Zustimmung ab. Die Verbindung kann von mehreren Event-Typen im Workspace wiederverwendet werden.
  </Tab>

  <Tab title="Native">
    Wähle einen deiner [Buchungs-Event-Typen](/de/assistants/native-calendar#die-integrierte-buchungs-engine).
  </Tab>
</Tabs>

Jede Integration wird **vor dem Speichern geprüft**. Ungültige Zugangsdaten oder Event-Einstellungen werden mit einer klaren Fehlermeldung abgelehnt. Geheime Werte werden nach dem Speichern nie wieder angezeigt.

Löschst du die letzte Integration, die ein Acuity-Konto verwendet, widerruft das den OAuth-Token über Acuitys Disconnect-Endpunkt und entfernt die lokale Verbindung. Ein ungenutztes Konto lässt sich außerdem im Acuity-Editor über **Disconnect account** entfernen; gemeinsam genutzte Konten lassen sich erst trennen, wenn ihre verbleibenden Integrationen entfernt wurden.

Bestehende Personal-Access-Token-Integrationen funktionieren weiterhin, erscheinen aber als
**Legacy connection — reconnect with Calendly**. Das erneute Verbinden hebt sie auf
OAuth an und entfernt das PAT aus der Integration.

## Einem Assistenten zuweisen

Öffne die Einstellungen des Assistenten und hake die Integrationen an, die er nutzen soll (oder rufe `PUT /api/v1/assistants/{id}/integrations` auf). Jede zugewiesene Integration fügt jedem Anruf ihre eigenen Buchungstools hinzu:

| Tool                                                           | Typ                                                          | Funktion                                                                                                                                                                                                               |
| -------------------------------------------------------------- | ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `check_availability(start_date, end_date?)`                    | nur lesend, unterbrechbar                                    | Ruft offene Slots für den Datumsbereich ab und liest sie in der Zeitzone des Assistenten vor (gedeckelt, damit der Agent nie 200 Slots aufzählt).                                                                      |
| `book_appointment(name, email, start, notes?)`                 | schreibend – läuft mit einer Füllphrase, nicht unterbrechbar | Bucht den gewählten Slot. Bei Erfolg werden Buchungsbeginn und -ID als Anrufvariablen für Flows, Analysen und Webhooks gespeichert. War der Slot gerade vergeben, wird der Agent angewiesen, einen anderen anzubieten. |
| `send_booking_link(email?, phone?)`                            | nur im Calendly-Link-Modus                                   | Erstellt einen Einmal-Buchungslink und verschickt ihn per SMS oder E-Mail.                                                                                                                                             |
| `find_appointment(email, name)`                                | Calendly-/Acuity-Verwaltung                                  | Findet kommende Termine für den ausgewählten Event-/Termintyp. Sowohl die exakte Buchungs-E-Mail als auch der vollständige Name sind erforderlich.                                                                     |
| `cancel_appointment(event_id / appointment_id, confirmed)`     | schreibend – nicht unterbrechbar                             | Storniert nur einen Termin, den `find_appointment` im selben Anruf geliefert hat, nachdem der Assistent ihn vorgelesen und eine ausdrückliche Bestätigung erhalten hat.                                                |
| `reschedule_appointment(appointment_id, new_start, confirmed)` | Acuity-Verwaltung                                            | Verschiebt nur einen Acuity-Termin, der im selben Anruf geliefert wurde, nachdem die Verfügbarkeit geprüft und der Anrufer die neue Zeit ausdrücklich bestätigt hat.                                                   |

Jede Integration erhält `check_availability` und `book_appointment`. Die Verwaltungstools kommen nur dort hinzu, wo der Anbieter sie unterstützt: **Calendly** (finden und stornieren), **Acuity** (finden, stornieren und umbuchen, entsprechend den von dir gesetzten Umschaltern) sowie die **integrierte Engine**, die ein workspace-weites Set hinzufügt, das den Anrufer zuerst anhand der Telefonnummer identifiziert und auf E-Mail plus vollständigen Namen zurückfällt. **Cal.com**-, **eTermin**- und **HighLevel**-Kalender bieten derzeit nur Verfügbarkeit und Buchung – der Assistent kann darauf Slots lesen und buchen, aber während eines Anrufs keinen bestehenden Termin nachschlagen, stornieren oder verschieben.

Ist mehr als eine Integration zugewiesen, bekommen die Tool-Namen den Integrationsnamen als Suffix (zum Beispiel `check_availability_sales`). Slots werden immer in der **[Zeitzone](/de/assistants/timezone) des Assistenten** angesagt – stelle sie in den Einstellungen des Assistenten ein.

<Note>
  Calendly-Buchungen lassen sich nicht über die API umbuchen – ein Anrufer, der eine andere Zeit möchte, bekommt stattdessen ein frisches `cancel_appointment` und `book_appointment`, oder bucht über den Link in seiner Calendly-Bestätigungs-E-Mail um.
</Note>

<Tip>
  Sag dem Assistenten in seinem Prompt, **wann** er buchen soll, z. B.: *„Bevor du eine Zeit anbietest, rufe check\_availability auf. Sobald der Anrufer einen Slot bestätigt, rufe book\_appointment mit Name und E-Mail auf."*
</Tip>

## Plan-Gating

Dein Plan muss **Calendar integrations** enthalten. Ist das nicht der Fall, kannst du keine Integrationen erstellen.

## Fehlerbehebung

<AccordionGroup>
  <Accordion title={`Cal.com: „Invalid API key" oder Event-Typen laden nicht`}>
    Prüfe, ob der Key in Cal.com noch aktiv ist und ob du einen Live-Key eingefügt hast (Cal.coms Live-Keys beginnen mit `cal_live_`), und wähle dann erneut **Load event types**. Bekommst du statt einer leeren Liste einen Authentifizierungsfehler, hast du wahrscheinlich den falschen API-Endpunkt gewählt – ein EU-Cal.com-Konto braucht den EU-Endpunkt (oder Custom für eine selbst gehostete Instanz), nicht den US-Standard.
  </Accordion>

  <Accordion title="Cal.com: Der Assistent fragt immer wieder nach einer E-Mail-Adresse, oder die Buchung wird nie abgeschlossen">
    `book_appointment` braucht eine gültige E-Mail-Adresse, weil Cal.com eine Buchung ohne diese ablehnt. Gesprochene Adressen („anna at example dot com") und deutsche Umlaute werden automatisch umgewandelt, bevor die Anfrage rausgeht, sodass die meisten diktierten Adressen funktionieren; ist das, was der Assistent gehört hat, trotzdem nicht verwendbar, wird er angewiesen, erneut zu fragen statt zu buchen. Weise ihn im Prompt an, die E-Mail vor der Buchung zu erfassen und zu bestätigen und dabei eine bereits als [Anrufvariable](/de/assistants/variables) vorliegende Adresse wiederzuverwenden, statt zweimal zu fragen.
  </Accordion>

  <Accordion title="Calendly: „Specified location kind is not configured for this event type&#x22;">
    Der einzige Ort des Event-Typs in Calendly ist ein Videokonferenz-Link (Google Meet, Zoom, Teams), und der Voice-Agent kann keine Meeting-Links generieren. Bearbeite den Event-Typ in Calendly und füge **Custom** oder **Phone Call → Inbound call** als Ort hinzu – Custom ist die sicherste Wahl und funktioniert in jedem Fall. Hat der Event-Typ danach mehr als einen Ort, wähle den richtigen unter **Meeting location** in der Integration.
  </Accordion>

  <Accordion title="Calendly: Manche Team-Event-Typen fehlen">
    In einer Calendly-Organisation sehen Admin- und Owner-Konten die Event-Typen aller Mitglieder, einschließlich Round-Robin- und Collective-Events; ein reguläres Mitgliedskonto sieht nur seine eigenen.
  </Accordion>

  <Accordion title="Buchungen verhalten sich im Browser-Test anders als bei einem echten Anruf">
    Ein **Web Call**-Test läuft ohne Telefonnummer, daher kann alles, was der Buchungsablauf aus der Nummer des Anrufers ableitet (einen Buchungslink per SMS senden, einen Termin anhand der Telefonnummer nachschlagen), nicht auf dieselbe Weise funktionieren. Nutze **Test → Call** im Assistenten-Header für einen realistischen Testlauf: Entweder wählt der Assistent eine von dir eingegebene Nummer, oder du wählst selbst seine eingehende Nummer.
  </Accordion>
</AccordionGroup>

Kommst du nicht weiter? Kontaktiere den Support mit dem Namen der Integration, dem im Assistenten-Editor angezeigten Fehler und einem Transkript des Anrufs, bei dem die Buchung fehlgeschlagen ist.

## API & MCP

Alles oben Beschriebene steht über die [öffentliche REST-API](/de/api-reference/introduction) und als MCP-Tools unter `https://<your-domain>/mcp` zur Verfügung:

| REST                                                                          | MCP-Tool                                                                                                 | Scope                                |
| ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------ |
| `GET/POST /api/v1/integrations`, `GET/PATCH/DELETE /api/v1/integrations/{id}` | `list_integrations`, `get_integration`, `create_integration`, `update_integration`, `delete_integration` | `integrations:read/write`            |
| `POST /api/v1/integrations/calendly/oauth-url`                                | `create_calendly_oauth_url`                                                                              | `integrations:write`                 |
| `GET /api/v1/integrations/calendly/connections`                               | `list_calendly_connections`                                                                              | `integrations:read`                  |
| `GET /api/v1/integrations/calendly/event-types?connection_id=…`               | `list_calendly_event_types`                                                                              | `integrations:read`                  |
| `POST /api/v1/integrations/acuity/oauth-url`                                  | `create_acuity_oauth_url`                                                                                | `integrations:write`                 |
| `GET /api/v1/integrations/acuity/connections`                                 | `list_acuity_connections`                                                                                | `integrations:read`                  |
| `GET /api/v1/integrations/acuity/appointment-types?connection_id=…`           | `list_acuity_appointment_types`                                                                          | `integrations:read`                  |
| `GET /api/v1/integrations/acuity/calendars?connection_id=…`                   | `list_acuity_calendars`                                                                                  | `integrations:read`                  |
| `GET/PUT /api/v1/assistants/{id}/integrations`                                | `get_assistant_integrations`, `set_assistant_integrations`                                               | `integrations:*` oder `assistants:*` |

Event-Typen, Verbindungen und Buchungsdatensätze der integrierten Engine sind auf [Integrierter Kalender](/de/assistants/native-calendar) beschrieben.
