Zum Hauptinhalt springen

Menschen

Vier Bereiche rund um Personen: Mitglieder (Stammdaten), Gruppen & Verteiler (wer gehört zu wem), Warteliste (wer möchte dazu) und Nachweise (Führungszeugnisse und befristete Nachweise).

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


Mitglieder

Bereich mitglieder · Repository derselbe wie in der Oberfläche. Ein über die Schnittstelle angelegtes Mitglied bekommt seine Mitgliedsnummer genauso automatisch wie eines aus der Anwendung.

MethodePfadBereichBeschreibung
GET/mitgliedermitglieder:readListe
POST/mitgliedermitglieder:writeAnlegen
GET/mitglieder/{id}mitglieder:readEinzeln lesen
PUT/mitglieder/{id}mitglieder:writeÄndern
DELETE/mitglieder/{id}mitglieder:writeLöschen
POST/mitglieder/{id}/kuendigenmitglieder:writeMitgliedschaft kündigen
GET/mitglieder/beitragsstufenmitglieder:readBeitragsstufen (Liste)
GET/mitglieder/feldermitglieder:readDie selbst angelegten Felder
GET/mitglieder/{id}/familiemitglieder:readFamilien-Verknüpfungen (Liste)
POST/mitglieder/{id}/familiemitglieder:writeVerknüpfung anlegen
DELETE/mitglieder/{id}/familie/{relatedId}mitglieder:writeVerknüpfung lösen
GET/mitglieder/{id}/gruppen-historiemitglieder:readZeiträume (Liste)
POST/mitglieder/{id}/gruppen-historiemitglieder:writeZeitraum anlegen
PUT/mitglieder/{id}/gruppen-historie/{eintragId}mitglieder:writeZeitraum korrigieren
DELETE/mitglieder/{id}/gruppen-historie/{eintragId}mitglieder:writeZeitraum entfernen

Liste filtern

ParameterBedeutung
qSuche über Name, E-Mail und Mitgliedsnummer
gruppe_idNur Mitglieder dieser Gruppe
artmember oder contact
statusapplicant, active oder cancelled
nur_aktivetrue = nur aktive
labelNur Mitglieder mit diesem Label

Sortierbar: last_name (Standard), first_name, member_number, email, join_date, leave_date, created_at, updated_at.

Diese Liste blättert in der Datenbank – sie ist die größte des Systems und wird nicht für jede Seite komplett geladen. updated_since wirkt hier echt filternd.

Felder

FeldTypAnmerkung
kindmember | contactMitglied oder reiner Kontakt
membership_statusapplicant | active | cancelled
salutationdu | sieAnrede in Serienmails
title, first_name, last_nameText
genderweiblich | maennlich | nonbinaer | ""
email, email_ccE-Mailwird auf Gültigkeit geprüft
phoneText
phonesListe aus label + numbermehrere Nummern mit Beschriftung
street, address_extra, zip, city, countryText
member_numberTextbeim Anlegen automatisch, wenn kind = member
group_idsListe von UUIDsMehrfachzugehörigkeit ist möglich
birth_date, join_date, leave_dateJJJJ-MM-TT
diet, intolerances, health_info, swimTextGesundheits- und Verpflegungsangaben
fee_level_idUUIDgültige Werte über /mitglieder/beitragsstufen
membership_feeZahl ≥ 0abweichender Einzelbetrag
payment_method, iban, bic, account_holderTextBankverbindung
custom_valuesObjektSchlüssel über /mitglieder/felder
labelsListe von Texten
notesText
is_activeWahrheitswert
Beim Anlegen ist ein Merkmal Pflicht

Mindestens Vorname, Nachname oder E-Mail muss gesetzt sein. Ein Kontakt ohne Name und ohne Adresse ist eine leere Zeile, die niemandem hilft.

curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"kind":"member","first_name":"Maja","last_name":"Beispiel","email":"maja@example.org","group_ids":["…"]}' \
"$BASIS/mitglieder"

Kündigen

POST /mitglieder/{id}/kuendigen mit optionalem austritt_am (ohne Angabe: heute).

Warum ein eigener Endpunkt und nicht PUT {"membership_status":"cancelled"}

Am Kündigen hängen das Austrittsdatum, die Bestätigungsmail an das Mitglied und die Benachrichtigung der Verwaltung. Wer nur die Spalte setzt, bekommt ein stilles Ende ohne beides.

Familie

Familien-Verknüpfungen gelten gegenseitig – deshalb gibt es kein Richtungsfeld. POST erwartet {"related_id":"<uuid>"} und antwortet mit der vollständigen Liste. Eine Person lässt sich nicht mit sich selbst verknüpfen.

Gruppen-Historie

Die aktuelle Zugehörigkeit steht in group_ids am Mitglied. Hier liegen die Zeiträume, aus denen sich Stufenwechsel nachvollziehen lassen.

FeldTypAnmerkung
group_idUUIDnur beim Anlegen; ein PUT ändert die Gruppe nicht
from_date, to_dateJJJJ-MM-TT
noteText

Gruppen & Verteiler

Bereich gruppen. Beides liegt zusammen, weil beides dieselbe Frage beantwortet: wer gehört zu wem. Eine Gruppe ist die fachliche Zugehörigkeit eines Mitglieds, ein Verteiler eine frei zusammengestellte Empfängerliste.

MethodePfadBereichBeschreibung
GET/gruppengruppen:readListe
POST/gruppengruppen:writeAnlegen
GET/gruppen/{id}gruppen:readEinzeln lesen
PUT/gruppen/{id}gruppen:writeÄndern
DELETE/gruppen/{id}gruppen:writeLöschen
GET/gruppen/{id}/mitgliedergruppen:readMitglieder dieser Gruppe (Liste)
GET/gruppen/verteilergruppen:readVerteiler (Liste)
POST/gruppen/verteilergruppen:writeVerteiler anlegen
GET/gruppen/verteiler/{id}gruppen:readVerteiler samt Empfängern
PUT/gruppen/verteiler/{id}gruppen:writeVerteiler ändern
DELETE/gruppen/verteiler/{id}gruppen:writeVerteiler löschen
PUT/gruppen/verteiler/{id}/mitgliedergruppen:writeEmpfängerliste vollständig ersetzen

Gruppe: name (Pflicht, max. 120), description (max. 500), sort_order (Zahl). Sortierbar nach name, sort_order (Standard), created_at.

Verteiler: name (Pflicht), description.

Empfänger setzen:

{
"members": [
{ "contact_id": "8f2c…" },
{ "email": "presse@example.org", "name": "Presse" }
]
}

Je Eintrag ist entweder contact_id oder email nötig – Verteiler dürfen auch Leute enthalten, die kein Mitglied sind. Der Aufruf ersetzt die Liste vollständig; ein Einzel-Hinzufügen gibt es bewusst nicht, weil ein Abgleich von außen die Menge als Ganzes schreibt.

Der häufigste Lesezugriff überhaupt

GET /gruppen/{id}/mitglieder – die Mitglieder einer Stufe für die Vereinswebsite oder einen Serienbrief.


Warteliste

Bereich warteliste. Typischer Fall von außen: Das Anmeldeformular der Website trägt Interessierte direkt in die Warteliste der passenden Stufe ein.

MethodePfadBereichBeschreibung
GET/wartelistewarteliste:readListe
POST/wartelistewarteliste:writeEintrag anlegen
GET/warteliste/{id}warteliste:readEinzeln lesen
PUT/warteliste/{id}warteliste:writeÄndern
DELETE/warteliste/{id}warteliste:writeLöschen

Filter: gruppe_id, q (Namen und E-Mail). Sortierbar: waitlist_date (Standard), last_name, birth_date, status.

FeldTypAnmerkung
group_idUUIDdie gewünschte Stufe
first_name, last_nameTextdas Kind
birth_dateJJJJ-MM-TTGrundlage fürs Aufrücken
contact_name, email, phoneTextdie Eltern
noteText
statuswartend | kontaktiert | aufgenommen | abgesagt
waitlist_dateJJJJ-MM-TTohne Angabe: heute; bestimmt die Reihenfolge

Nachweise

Bereich nachweise. Führungszeugnisse und befristete Nachweise (Juleica, Erste Hilfe …).

Die Dateien gibt es über die Schnittstelle nicht

Dass für eine Person ein Führungszeugnis vorliegt, ist eine besonders schutzwürdige Angabe. Über die Schnittstelle kommt nur der Sachstand – vorgelegt, geprüft, gültig bis. Wer die Datei braucht, öffnet sie in der Anwendung; die Aufbewahrungsregel „FZ-Dateisperre“ bleibt so unangetastet.

MethodePfadBereichBeschreibung
GET/nachweise/typennachweise:readNachweis-Arten (Liste)
GET/nachweise/uebersichtnachweise:readSachstand: wer braucht was, und wie steht es darum
GET/nachweise/typen/{typId}/anforderungennachweise:readWer diesen Nachweis braucht
PUT/nachweise/typen/{typId}/anforderungennachweise:writeAnforderungen setzen
GET/nachweise/mitglied/{contactId}nachweise:readNachweise einer Person (Liste)
GET/nachweise/{id}nachweise:readEinzeln lesen
POST/nachweisenachweise:writeAnlegen bzw. Stand aktualisieren
PUT/nachweise/{id}nachweise:writeÄndern
DELETE/nachweise/{id}nachweise:writeLöschen

Filter der Übersicht: typ_id, gruppe_id, mitglied_id.

FeldTypAnmerkung
contact_idUUIDPflicht beim Anlegen, danach unveränderlich
type_idUUIDPflicht beim Anlegen, danach unveränderlich
issued_on, valid_from, valid_untilJJJJ-MM-TT
inspectedWahrheitswertEinsichtnahme erfolgt
inspector_nameText
inspected_atJJJJ-MM-TT
exemptWahrheitswertvon der Pflicht befreit
notesText
custom_valuesObjekteigene Felder der Nachweis-Art

Je Person und Art gibt es genau einen aktuellen Stand: Ein zweites POST ersetzt ihn, der alte wandert in die Historie. Ist für die Art die Bestätigung „Erhalten“ eingeschaltet, geht sie auch dann raus, wenn der Stand über die Schnittstelle kommt – meta.mailed in der Antwort sagt, ob eine Mail verschickt wurde.

Anforderungen setzen:

{ "gruppen": ["<uuid>", "<uuid>"], "mitglieder": ["<uuid>"] }

Jede mitgeschickte Liste wird vollständig ersetzt, eine weggelassene bleibt unangetastet – so lassen sich Gruppen ändern, ohne die einzeln benannten Personen zu verlieren.

updated_since auf der Übersicht

Der Sachstand entsteht aus mehreren Tabellen und trägt keinen eigenen Zeitstempel. Ein updated_since läuft hier bewusst in einen 400 statt eine leere Liste vorzutäuschen – siehe Konventionen.

Hat dies deine Frage beantwortet?