Dokumentationsstandard
Dieser Standard gilt für jede Änderung an der öffentlichen REST-API, am Kalenderfeed und an ausgehenden Webhooks. Ziel ist ein nachvollziehbarer Vertrag für Integrationen, ohne interne Implementierungsdetails preiszugeben.
Quelle der Wahrheit
Abschnitt betitelt „Quelle der Wahrheit“Die OpenAPI-Datei /openapi/public-v1.yaml
(apps/docs/public/openapi/public-v1.yaml) ist die Source of Truth für den
öffentlichen REST-Vertrag. Markdown-Seiten erklären den Vertrag auf Deutsch;
sie dürfen ihn nicht widersprechen.
Reihenfolge bei einer Vertragsänderung:
- OpenAPI anpassen.
- Referenz, Quickstart und bei Bedarf Webhooks und Kalender nachziehen.
- Änderungen aktualisieren, bevor ein inkompatibles Verhalten ausgeliefert wird.
apps/e2e/tests/integrations.spec.tsan den neuen Vertrag anpassen.
Code in packages/api und apps/server/src/routes/integration.ts muss dem
OpenAPI-Dokument entsprechen. Weichen Build und Spezifikation voneinander ab,
ist die Änderung nicht fertig.
URI-Versionierung
Abschnitt betitelt „URI-Versionierung“Die öffentliche REST-API versioniert über den Pfad /v1/, nicht über
Header:
/api/public/v1/courses/api/public/v1/bookings/api/calendar/v1/{token}.ics
Kompatible Ergänzungen (optionale Felder, neue Scopes ohne Pflicht) bleiben
in /v1/. Ein Breaking Change — entfernte Felder, geänderte Bedeutung,
andere Fehlerform, neue Pflicht-Header — braucht eine neue URI-Version
(/v2/) und einen Changelog-Eintrag vor der Auslieferung. /v1/ bleibt
dann so lange erreichbar, bis der Changelog ein End-of-Life nennt.
Die Widget-API unter /api/widget/v1/ versioniert getrennt und gehört nicht
in public-v1.yaml.
Changelog vor Breaking Changes
Abschnitt betitelt „Changelog vor Breaking Changes“Jeder sichtbare Vertragswechsel steht in Änderungen. Das gilt auch für Beta. Ein Pull Request, der Verhalten bricht, ohne Changelog-Eintrag und ohne OpenAPI-Aktualisierung, erfüllt die Definition of Done nicht.
Als Breaking Change gelten insbesondere:
- entfernte oder umbenannte Felder in
data - andere HTTP-Statuscodes oder
error.code-Werte - Pflicht-Scope, der bisher nicht nötig war
- kleineres Rate-Limit oder kleineres Buchungslimit
- Einführung von Cursor-Pagination, die bestehende Clients ohne Cursor ausschließt
CI-Prüfungen
Abschnitt betitelt „CI-Prüfungen“Zwei automatisierte Gates sichern den Vertrag:
| Prüfung | Befehl / Artefakt | Zweck |
|---|---|---|
| Docs-Build | npx turbo run build --filter=docs |
Starlight-Build plus scripts/check-docs.mjs |
| Integrations-E2E | apps/e2e/tests/integrations.spec.ts |
echter Happy Path über API, Kalender und Webhook |
Der Docs-Build muss die OpenAPI-Datei als statische Datei nach
/openapi/public-v1.yaml kopieren und redaktionelle Checks bestehen. Die
E2E-Suite ersetzt die Widget-API nicht und darf keine Produktivschlüssel
verwenden.
Lokal reicht zuerst der Docs-Build, danach der kleinste relevante E2E-Lauf
mit integrations.spec.ts. Ohne beide Nachweise gilt die API-Änderung als
unverifiziert.
Redaktionelle Pflicht
Abschnitt betitelt „Redaktionelle Pflicht“Dokumentation gehört in denselben Pull Request wie die Verhaltensänderung.
Secrets, Klartext-Keys (orb_api_, orb_cal_, whsec_) und interne IDs
dürfen nicht in Beispielen stehen; Platzhalter sind YOUR_API_KEY und
YOUR_CALENDAR_TOKEN. Der redaktionelle Ablauf steht in
Qualität und Prozess.

