REST-API

Mit der API kannst du Kalender und Termine aus anderen Programmen lesen und schreiben, etwa aus einer Warenwirtschaft, einem Ticketsystem oder einer eigenen App.

Authentifizierung

Der Administrator deiner Firma legt unter Verwaltung → API-Schlüssel einen Schlüssel an. Dort legt er auch fest, was der Schlüssel darf: Rechte und Kalender, genau wie bei Personen. Der Schlüssel wird nur einmal angezeigt. Er wird bei jeder Anfrage als Bearer-Token mitgeschickt:

curl https://api.rstcal.com/v1/calendars \
  -H "Authorization: Bearer kal_1a2b3c4d_…"

Schlüssel mit der Option „Verwaltung“ dürfen zusätzlich Kalender anlegen, ändern und löschen. Personen und API-Schlüssel lassen sich über die API nicht verwalten.

Grundlagen

Kalender

GET /calendarsAlle Kalender, die der Schlüssel sehen darf, mit editable
POST /calendarsKalender anlegen {"name": "Fahrzeug 3", "color": "#1565c0"} (nur mit Verwaltungsrecht)
PUT /calendars/{id}Name, Farbe, active, sort_order ändern
DELETE /calendars/{id}Kalender löschen (Termine nur dieses Kalenders werden mitgelöscht)
[
  { "id": 12, "name": "Anna", "color": "#c62828", "sort_order": 0, "active": true, "editable": true },
  { "id": 13, "name": "Ben",  "color": "#1565c0", "sort_order": 1, "active": true, "editable": false }
]

Termine

GET /events?start=…&end=…Termine im Zeitraum (max. 400 Tage), Serien sind aufgelöst
GET /events/search?q=…Volltextsuche in Titel, Ort und Beschreibung
GET /events/{id}Einzelner Termin
POST /eventsTermin anlegen
PUT /events/{id}Termin vollständig ändern
PATCH /events/{id}/moveNur Zeit ändern, optional Kalender tauschen: {"start", "end", "all_day", "replace_calendar": {"from": 12, "to": 13}}
DELETE /events/{id}Termin löschen

Termin anlegen

curl -X POST https://api.rstcal.com/v1/events \
  -H "Authorization: Bearer kal_…" -H "Content-Type: application/json" \
  -d '{
    "title": "Glasfaser-Anschluss Müller",
    "calendar_ids": [12, 13],
    "start": "2026-11-10T09:00:00+01:00",
    "end":   "2026-11-10T11:30:00+01:00",
    "location": "Hauptstr. 5, 79774 Albbruck",
    "description": "Kunde ist ab 9 Uhr da."
  }'

Antwort / Termin-Objekt

{
  "id": "481",
  "calendar_id": 12,
  "calendar_ids": [12, 13],
  "title": "Glasfaser-Anschluss Müller",
  "location": "Hauptstr. 5, 79774 Albbruck",
  "description": "Kunde ist ab 9 Uhr da.",
  "all_day": false,
  "start": "2026-11-10T08:00:00Z",
  "end": "2026-11-10T10:30:00Z",
  "rrule": null,
  "series_id": null,
  "recurrence_key": null,
  "created_by_name": "API: Warenwirtschaft",
  "attachments": []
}

Ein Termin kann mehreren Kalendern zugeordnet sein (calendar_ids). Ändern darf ihn nur, wer alle zugeordneten Kalender bearbeiten darf.

Serientermine

Beim Anlegen oder Ändern setzt man rrule als RFC-5545-Regel ohne „RRULE:“. Erlaubt sind FREQ (DAILY, WEEKLY, MONTHLY, YEARLY), INTERVAL, BYDAY, BYMONTHDAY, BYMONTH, BYSETPOS, COUNT (max. 1000) und UNTIL.

{ "title": "Teammeeting", "calendar_ids": [12], "start": "2026-11-02T08:00:00+01:00",
  "end": "2026-11-02T08:30:00+01:00", "rrule": "FREQ=WEEKLY;BYDAY=MO,TH" }

Anhänge

POST /events/{id}/attachmentsDateien hochladen (multipart/form-data, Feld files)
GET /attachments/{id}Datei herunterladen
DELETE /attachments/{id}Datei löschen
curl -X POST https://api.rstcal.com/v1/events/481/attachments \
  -H "Authorization: Bearer kal_…" -F "files=@plan.pdf"

Export

GET /export.ics?from=&to=&calendars=12,13iCalendar (benötigt Export-Recht)
GET /export.csv?…CSV (Excel)

Fehler

Fehler kommen mit passendem HTTP-Status und einem Fehlercode zurück:

HTTP/1.1 403 Forbidden
{ "error": "err.no_permission_calendar" }
401Schlüssel fehlt, ist ungültig oder deaktiviert (err.invalid_api_key)
403Recht fehlt (err.no_permission, err.no_permission_calendar, err.admin_only)
404Nicht gefunden oder nicht sichtbar
400Ungültige Eingabe (err.invalid_date, err.invalid_rrule, err.title_required …)
413Datei zu groß oder Speicher voll
429Zu viele Anfragen