Zum Hauptinhalt springen

Kommunikation & System

Fünf Bereiche: Mails (der einzige Weg nach außen), Dokumente (Cloudspeicher), Hinweise (Dashboard-Meldungen), Kalender (nur lesend) und Stammdaten (Benutzer, Rollen, Protokoll – ebenfalls nur lesend). Dazu die beiden allgemeinen Endpunkte.

Alle Pfade sind relativ zu https://<domain>/api/v1.


Mails

Bereich mails.

Der einzige Endpunkt, der etwas Unwiderrufliches nach außen schickt

Deshalb ist der Versand zweistufig: Ein Werkzeug legt einen Entwurf mit Empfängern an und löst den Versand anschließend ausdrücklich aus. Es gibt kein „anlegen und sofort senden“ in einem Aufruf – ein Schleifenfehler im fremden Skript soll nicht in hundertfachem Mailversand enden.

MethodePfadBereichBeschreibung
GET/mailsmails:readNachrichten (Liste)
POST/mailsmails:writeEntwurf anlegen
GET/mails/{id}mails:readEine Nachricht
PUT/mails/{id}mails:writeEntwurf ändern
DELETE/mails/{id}mails:writeNachricht löschen
POST/mails/{id}/sendenmails:writeEntwurf versenden
GET/mails/{id}/anhaengemails:readAnhänge (Liste)
PUT/mails/{id}/anhaengemails:writeAnhang hochladen
GET/mails/{id}/anhaenge/{anhangId}/inhaltmails:readAnhang herunterladen
DELETE/mails/{id}/anhaenge/{anhangId}mails:writeAnhang entfernen
GET/mails/vorlagenmails:readVorlagen (Liste)
POST/mails/vorlagenmails:writeVorlage anlegen
GET/mails/vorlagen/{id}mails:readEine Vorlage
PUT/mails/vorlagen/{id}mails:writeVorlage ändern
DELETE/mails/vorlagen/{id}mails:writeVorlage löschen
GET/mails/ordnermails:readOrdner (Liste)

Filter: q (Betreff, Empfänger), status (draft oder sent), ordner_id, archiviert. Sortierung: fest, neueste zuerst – diese Liste kennt kein sort.

Felder einer Nachricht

FeldTypAnmerkung
subjectTextPflicht
body_htmlTextder Inhalt; Platzhalter wie in der Anwendung
reply_toE-Mailabweichendes „Antwort an“
include_signature, signature_idSignatur
template_idUUIDverwendete Vorlage
folder_idUUIDOrdner, siehe /mails/ordner
targetsListedie Empfänger

Ein Empfänger-Eintrag hat target_type (group, list, contact oder email) und je nachdem target_id oder email, optional label:

{
"subject": "Sommerlager 2026",
"body_html": "<p>Hallo {{vorname}},</p><p>…</p>",
"targets": [
{ "target_type": "group", "target_id": "<uuid>" },
{ "target_type": "email", "email": "presse@example.org", "label": "Presse" }
]
}

Wird ein PUT mit targets geschickt, ersetzt es die Empfängerliste vollständig. Eine versendete Nachricht lässt sich nicht mehr ändern (400).

Versenden

curl -X POST -H "Authorization: Bearer $KEY" "$BASIS/mails/<id>/senden"

Ohne Empfänger und bei bereits versendeten Nachrichten kommt 400. Der Versand läuft über denselben Dienst wie die Anwendung: dieselbe Personalisierung, dieselben Platzhalter, dieselbe Protokollierung. Bleibt der Mailserver stumm, greift die Warteschlange der Anwendung.

Anhänge

Anhänge gehören zum Entwurf. Nach dem Versand lassen sie sich weder hinzufügen noch entfernen: Was im Postfach der Empfänger liegt, ändert kein späterer Aufruf mehr.

curl -X PUT -H "Authorization: Bearer $KEY" \
-H "Content-Type: application/pdf" --data-binary @programm.pdf \
"$BASIS/mails/<id>/anhaenge?name=programm.pdf"

Obergrenze 10 MB – Anhänge liegen in der Datenbank und gehen anschließend als Kopie an jede Empfängerin.

Vorlage: name (Pflicht), subject, body_html.


Dokumente

Bereich dokumente. Ordner und Dateien im Cloudspeicher.

Ein Schlüssel sieht alle Ordner

Die Freigaben je Ordner hängen an Benutzerkonten und Rollen; ein Schlüssel hat weder das eine noch das andere. Er kann also nicht „nur die freigegebenen Ordner“ sehen. Wer nur einzelne Ordner nach außen geben will, nimmt die Freigabelinks der Anwendung.

System-Ordner der Anwendung (z. B. Anhänge von Hinweisen) bleiben auch hier tabu.

MethodePfadBereichBeschreibung
GET/dokumente/ordnerdokumente:readOrdner einer Ebene (Liste)
POST/dokumente/ordnerdokumente:writeOrdner anlegen
GET/dokumente/ordner/{id}dokumente:readOrdner samt Inhalt
DELETE/dokumente/ordner/{id}dokumente:writeOrdner in den Papierkorb
GET/dokumente/{id}dokumente:readAngaben zur Datei
GET/dokumente/{id}/inhaltdokumente:readDatei herunterladen
PUT/dokumente/uploaddokumente:writeDatei hochladen
DELETE/dokumente/{id}dokumente:writeDatei in den Papierkorb

GET /dokumente/ordner listet die oberste Ebene; mit eltern_id die Ebene darunter. GET /dokumente/ordner/{id} liefert den Ordner mit ordner (Unterordner) und dateien.

Ordner anlegen: {"name":"Protokolle","eltern_id":"<uuid oder weglassen>"}.

Hochladen – Ziel und Name kommen als Query-Parameter, der Rumpf ist die Datei:

curl -X PUT -H "Authorization: Bearer $KEY" \
-H "Content-Type: application/pdf" --data-binary @bericht.pdf \
"$BASIS/dokumente/upload?ordner_id=<uuid>&name=bericht.pdf"

Bis 2 GB; nichts läuft dabei durch den Arbeitsspeicher des Servers. Dateinamen mit Pfadtrennern werden abgewiesen.

DELETE legt Datei oder Ordner in den Papierkorb ("papierkorb": true); endgültiges Löschen bleibt der Anwendung vorbehalten.


Hinweise

Bereich hinweise. Zentrale Meldungen auf dem Dashboard – nützlich, um Meldungen aus einem anderen System einzuspielen („Hallenbad gesperrt“, „Anmeldung öffnet Montag“).

MethodePfadBereichBeschreibung
GET/hinweisehinweise:readListe
POST/hinweisehinweise:writeAnlegen
GET/hinweise/{id}hinweise:readEinzeln lesen
PUT/hinweise/{id}hinweise:writeÄndern
DELETE/hinweise/{id}hinweise:writeLöschen

Sortierbar: created_at (Standard), title, starts_at, expires_at.

FeldTypAnmerkung
titleTextPflicht
bodyText
levelinfo | warn | criticalbestimmt die Farbe
starts_at, expires_atZeitpunktbefristete Anzeige
is_activeWahrheitswert
dismissibleWahrheitswertdarf weggeklickt werden
pinnedWahrheitswertoben anheften
audienceTextZielgruppe
show_on_dashboardWahrheitswert
show_on_loginWahrheitswertöffentlich sichtbar auf der Anmeldeseite
show_in_portalWahrheitswertim Mitgliederportal
link_urlTextweiterführender Link
Zwei Felder mit Wirkung nach außen

show_on_login und show_in_portal machen eine Meldung für Leute sichtbar, die nicht angemeldet sind bzw. keine Verwaltungsrechte haben. Im Zweifel aus.

link_url wird geprüft und normalisiert (pfadfinder.dehttps://pfadfinder.de/). Nur http und https – ein javascript:-Ziel wird gar nicht erst gespeichert.

Anhänge lassen sich hier nicht setzen: Sie liegen als Dateien in einem System-Ordner, den die Schnittstelle bewusst nicht anfasst.


Kalender

Bereich kalender, nur lesend.

MethodePfadBereichBeschreibung
GET/kalenderkalender:readTermine (Liste)

Filter: von, bis (je JJJJ-MM-TT).

{
"data": [
{ "art": "veranstaltung", "id": "…", "titel": "Sommerlager", "ort": "Wiese",
"start_date": "2026-08-01", "end_date": "2026-08-10" },
{ "art": "packliste", "id": "…", "titel": "Sommerlager Material",
"start_date": "2026-07-30", "end_date": "2026-08-11" },
{ "art": "ausleihe", "id": "…", "titel": "Verliehen an Maja Beispiel",
"start_date": "2026-08-14", "end_date": "2026-08-16" }
],
"meta": { "total": 3, "von": null, "bis": null }
}

Termine gibt es hier nicht als eigenes Ding – sie sind immer die Sicht auf eine Veranstaltung, eine Packliste oder eine Ausleihe. Wer einen Termin anlegen will, legt eine Veranstaltung an. Deshalb hat dieser Bereich gar keinen Schreibweg.

Termine, die in den Zeitraum hineinragen, kommen mit – ein zweiwöchiges Lager taucht auch dann auf, wenn man nur nach der mittleren Woche fragt. Archivierte Veranstaltungen und Geburtstage bleiben draußen.


Stammdaten

Bereich stammdaten, nur lesend. Wer über einen Schlüssel Konten anlegen oder Rollen ändern könnte, könnte sich damit selbst mehr Rechte verschaffen, als der Schlüssel je hatte.

MethodePfadBereichBeschreibung
GET/stammdaten/benutzerstammdaten:readKonten der Verwaltung (Liste)
GET/stammdaten/rollenstammdaten:readRollen samt Rechten
GET/stammdaten/rechtestammdaten:readDer Rechte-Katalog der Anwendung
GET/stammdaten/protokollstammdaten:readAktivitätsprotokoll (Liste)
GET/stammdaten/einstellungenstammdaten:readÖffentliche Systemeinstellungen

Protokoll-Filter: q (Objekt und Konto), benutzer_id, objekt_art, objekt_id, aktion (created, updated, deleted …). Sortierung: fest, neueste zuerst. updated_since heißt hier seither angelegt – ein Protokolleintrag ändert sich nie.

Externe Überwachung ist ein guter Grund für eine Schnittstelle

„Hat sich in den letzten 24 Stunden jemand an den Bankdaten zu schaffen gemacht?“ soll man von außen beantworten können – deshalb ist das Protokoll lesbar.

GET /stammdaten/einstellungen liefert system_name, system_subtitle, primary_color, secondary_color, contact_email, required_fields, portal_enabled und documents_enabled – ohne Zugangsdaten und ohne Logo/Favicon, die als Data-URL mehrere hundert Kilobyte groß wären.


Allgemein

MethodePfadBereichBeschreibung
GET/mePrüft den Schlüssel und nennt seine wirksamen Bereiche
GET/openapi.jsonDie maschinenlesbare Beschreibung (OpenAPI 3.1)

Beide brauchen keinen Bereich, aber sehr wohl einen gültigen Schlüssel – auch openapi.json. Details unter Zugang & Schlüssel.

Hat dies deine Frage beantwortet?