Zurück zur Startseite

API-Dokumentation

Integriere termine.lol in deine eigene Anwendung.

Authentifizierung

Alle API-Anfragen müssen über einen API-Schlüssel authentifiziert werden. API-Schlüssel werden pro Kalender erstellt und können im Dashboard unter dem Tab „API-Schlüssel" verwaltet werden.

Sende deinen API-Schlüssel im Header:

x-api-key: your_api_key_here
API-Zugang ist ab dem Pro-Plan verfügbar.

Basis-URL

Alle Endpunkte verwenden die folgende Basis-URL:

https://termine.lol

Fehlerbehandlung

Alle Fehler werden als JSON mit einem `error`-Feld zurückgegeben:

{
  "error": "Ungültiger API-Key"
}

HTTP-Statuscodes


Buchungsablauf

Der typische Ablauf einer Buchung über die API:

  1. 1. Kalender abrufen → Mitglieder und Terminarten erhalten
  2. 2. Slots abrufen → Verfügbare Zeitfenster für einen Tag laden
  3. 3. Slot reservieren → 10-Minuten-Reservation erstellen
  4. 4. Buchung abschließen → Kundendaten senden, Bestätigungs-E-Mail wird versendet
  5. 5. Kunde bestätigt → Per Klick auf den E-Mail-Link wird die Buchung bestätigt

Kalender abrufen

Gibt die Grundinformationen eines Kalenders zurück, inklusive aktiver Mitglieder.

GET/api/embed/calendars/:id
curl -H "x-api-key: your_api_key" \
  https://termine.lol/api/embed/calendars/CALENDAR_ID

Pfad-Parameter

ParameterDescription
id*Die Kalender-ID

Antwort

{
  "data": {
    "id": "...",
    "title": "My Calendar",
    "timezone": "Europe/Berlin",
    "members": [
      { "id": "...", "name": "Max Mustermann" }
    ]
  }
}

Verfügbare Slots abrufen

Gibt die verfügbaren Zeitfenster für einen bestimmten Tag und eine Terminart zurück.

GET/api/embed/calendars/:id/slots
curl -H "x-api-key: your_api_key" \
  "https://termine.lol/api/embed/calendars/CALENDAR_ID/slots?date=2025-03-15&appointmentTypeId=TYPE_ID"

Query-Parameter

ParameterDescription
id*Die Kalender-ID
date*Datum im Format YYYY-MM-DD
appointmentTypeId*ID der Terminart
personUserIdMitglieder-ID (optional, Standard: „any")

Antwort

{
  "data": {
    "date": "2025-03-15",
    "personUserId": "any",
    "availableSlots": [
      { "slotIndex": 36, "time": "09:00" },
      { "slotIndex": 37, "time": "09:15" },
      { "slotIndex": 38, "time": "09:30" }
    ],
    "byPerson": [...]
  }
}

Slot reservieren

Reserviert einen Zeitslot für 10 Minuten. Innerhalb dieser Zeit muss die Buchung abgeschlossen werden.

POST/api/public/bookings/reserve
curl -X POST https://termine.lol/api/public/bookings/reserve \
  -H "Content-Type: application/json" \
  -d '{
    "calendarId": "CALENDAR_ID",
    "appointmentTypeId": "TYPE_ID",
    "date": "2025-03-15",
    "startSlot": 36
  }'

Request Body

ParameterDescription
calendarId*Kalender-ID
appointmentTypeId*Terminart-ID
date*Datum (YYYY-MM-DD)
startSlot*Slot-Index (0–95, jeweils 15 Min.)
personUserIdMitglieder-ID (optional)
appointmentModeTerminmodus: „online" oder „in_person" (optional, bei Hybrid)

Antwort

{
  "data": {
    "bookingId": "...",
    "reservationExpiresAt": "2025-03-15T10:10:00.000Z",
    "fields": [
      { "key": "email", "label": "E-Mail", "type": "email", "required": true },
      { "key": "name", "label": "Name", "type": "text", "required": true }
    ]
  }
}
Die `fields` enthalten die Formularfelder, die bei der Buchung ausgefüllt werden müssen.

Buchung abschließen

Sendet die Kundendaten für eine reservierte Buchung. Der Kunde erhält eine Bestätigungs-E-Mail.

POST/api/public/bookings/submit
curl -X POST https://termine.lol/api/public/bookings/submit \
  -H "Content-Type: application/json" \
  -d '{
    "bookingId": "BOOKING_ID",
    "customerEmail": "kunde@beispiel.de",
    "customerData": {
      "email": "kunde@beispiel.de",
      "name": "Max Mustermann"
    }
  }'

Request Body

ParameterDescription
bookingId*Buchungs-ID (aus der Reservierung)
customerEmail*E-Mail des Kunden
customerData*Kundendaten (Felder aus der Reservierung)

Antwort

{
  "data": {
    "success": true,
    "message": "Bestätigungs-E-Mail gesendet"
  }
}

Rate Limiting

API-Endpunkte sind rate-limited. Die Limits variieren je nach Endpunkt: