🚀 Jetzt neu: FlowAI! Ein revolutionärer Chat mit personalisierten AI-Agenten. 🌟

FlowEvents API - für Seminare, Teilnehmer und Zimmer

Eine vollständige REST API für die Seminarverwaltung. Sie deckt Veranstaltungen samt Terminen und Posten, Teilnehmer mit Warteliste und Abrechnung, Tagungshäuser und Zimmer, die Anwesenheitserfassung, den Versand von Unterschriften- und Feedback-Mails, die Feedback-Formulare mit ihren Feldern sowie fünf Auswertungen und fünf Exporte ab.

🚀 Schnellstart

Basis-URL: https://creativeskyline.de/api/flowevents/context https://creativeskyline.de/api/flowevents/events https://creativeskyline.de/api/flowevents/participants https://creativeskyline.de/api/flowevents/venues https://creativeskyline.de/api/flowevents/feedback-forms https://creativeskyline.de/api/flowevents/reports
FlowEvents-Berechtigung erforderlich
Der Benutzer benötigt eine aktive FlowEvents-Berechtigung. Ist das Modul in den Teameinstellungen abgeschaltet, antwortet jede Route mit HTTP 403.
Nur eine Rechteebene
FlowEvents kennt keine Unterrechte und keine Rolle je Veranstaltung. Wer das Modul hat, sieht und bearbeitet alle Seminare seines Teams. Die einzige zusätzliche Bedingung ist FlowAccounting, und die gilt nur für das Rechnungstellen und für die drei Exporte mit Geldbeträgen.
Alles wird über UUIDs adressiert
Veranstaltung, Termin, Teilnehmer, Zimmer, Tagungshaus, Posten, Formular und Feld werden ausschließlich über ihre UUID angesprochen. Numerische Felder wie cmm_client_id oder fev_room_id werden nicht entgegengenommen und führen zu einem Validierungsfehler, der das Ersatzfeld benennt.
Absagen, Abschliessen und Stornieren haben eigene Wege
Der Status einer Veranstaltung und die Stornierung eines Teilnehmers lassen sich nicht als Feld schreiben. Hinter beiden hängen Folgen: eine Stornierung storniert Raten, hebt offene Rechnungen auf und rückt die Warteliste nach. Ein Feldschreiben würde all das überspringen, deshalb wird es abgelehnt.
Die öffentlichen Seiten gehören nicht dazu
Die Seiten unter /events/sign/{token} und /events/feedback/{token} sind die Links aus den Mails an die Teilnehmer. Sie haben ihre eigene Authentifizierung über den Token und sind nicht Teil dieser Dokumentation.

1. API-Zugangsdaten abrufen

Melden Sie sich an, öffnen Sie Profil → API-Zugang und kopieren Sie Ihren persönlichen API-Key (pk_...).

2. Authentifizierung

Alle Anfragen benötigen diese HTTP-Header:

Authorization: Bearer pk_dein_api_key
Accept: application/json

3. Einstieg

Beginnen Sie mit GET /api/flowevents/context. Die Antwort nennt alle erlaubten Werte für Status, Format, Rolle und Zimmertyp, die verfügbaren Feldtypen der Feedback-Formulare, die gespeicherten Unterschriften-Vorgaben des Teams und ob FlowAccounting erreichbar ist.

4. Eine Veranstaltung braucht mindestens einen Termin

POST /api/flowevents/events nimmt die Termine und die Posten in derselben Anfrage entgegen. Mindestens ein Termin ist Pflicht, denn ohne Termin lässt sich weder Anwesenheit erfassen noch eine Liste exportieren.

5. Warteliste statt Fehler

Ist eine Veranstaltung voll, wird eine Anmeldung nicht abgelehnt, sondern auf die Warteliste gesetzt. Die Antwort nennt den tatsächlich geschriebenen Status. Nachrücken geschieht automatisch bei einer Stornierung und von Hand über POST /api/flowevents/participants/{uuid}/promote.

6. Volles Zimmer

Eine Zimmerzuteilung in ein volles Zimmer antwortet mit HTTP 409 und nennt Belegung und Kapazität. Dieselbe Anfrage mit confirm_overbooking: true schreibt die Überbelegung bewusst.

🧭 Überblick

Erlaubte Werte, Vorgaben und Verfügbarkeit abrufen

GET /api/flowevents/context

Liefert alle erlaubten Werte für Veranstaltungsstatus, Format, Struktur, Buchungsart, Teilnehmerstatus, Rolle, Zertifizierungsstatus, Zimmertyp und Postenart, die Feldtypen der Feedback-Formulare samt Grenzen der Sternebewertung, die möglichen Versand- und Exportarten, die gespeicherten Unterschriften-Vorgaben des Teams sowie die Angabe, ob FlowAccounting für dieses Team erreichbar ist.

📊 Auswertungen

Die Veranstaltung steht in der Abfrage
Jede Auswertung hat ihren eigenen festen Pfad und benennt die Veranstaltung über den Abfrageparameter event_uuid. So ist ein unbekannter Auswertungsname ein sauberer HTTP 404 und jede Auswertung dokumentiert ihre eigene Antwortform.

Anmeldestand

GET /api/flowevents/reports/participants

Zählt die Teilnehmer einer Veranstaltung je Status. Alle vier Status sind immer enthalten, auch wenn keiner vorliegt.

Query-Parameter:

event_uuid string * UUID der Veranstaltung.

Auslastung

GET /api/flowevents/reports/occupancy

Nennt Kapazität, belegte Plätze, freie Plätze und die Länge der Warteliste. Bei einer Veranstaltung ohne Kapazität ist free null und nicht null Plätze, denn ohne Obergrenze gibt es nichts zu zählen.

Query-Parameter:

event_uuid string * UUID der Veranstaltung.

Zimmerbelegung

GET /api/flowevents/reports/rooms

Listet die Zimmer dieser Veranstaltung mit der für sie geltenden Kapazität und der aktuellen Belegung sowie die Zahl der noch nicht zugeteilten Teilnehmer. Eine abweichende Kapazität gilt nur für diese Veranstaltung.

Query-Parameter:

event_uuid string * UUID der Veranstaltung.

Anwesenheit je Termin

GET /api/flowevents/reports/attendance

Zählt je Termin die anwesend gemeldeten Teilnehmer, die insgesamt erfassten Zellen und die abgegebenen Hausaufgaben. Die Differenz zwischen present und recorded sind die vermerkten Abwesenheiten.

Query-Parameter:

event_uuid string * UUID der Veranstaltung.

Feedback-Auswertung

GET /api/flowevents/reports/feedback

Wertet die abgegebenen Rückmeldungen einer Veranstaltung aus. Die Antworten werden nach der Frage gruppiert, zu der sie gehören, und nicht nach der Fassung, unter der sie gegeben wurden. Eine zweimal umformulierte Frage bleibt dadurch eine Frage.

Query-Parameter:

event_uuid string * UUID der Veranstaltung.

🗓️ Veranstaltungen

Die Buchungsart ist unveränderlich
Offen oder Inhouse wird beim Anlegen festgelegt. Eine Änderung wird abgelehnt und nicht stillschweigend ignoriert, denn an der Buchungsart hängen die Firma, die Kapazität und der ganze Abrechnungsweg.
Termine und Posten werden als Liste abgeglichen
Schicken Sie sessions oder price_items mit, gilt die Liste vollständig: was fehlt, wird entfernt. Lassen Sie den Schlüssel weg, bleibt beides unberührt. Ein Posten, der bereits auf einer Rechnung steht, lässt sich nicht entfernen und führt zu HTTP 409.
Ein Preis von 0 ist etwas anderes als kein Preis
Ein ausdrücklich gesetzter Preis von 0 bleibt 0,00 und bedeutet kostenlos. Ein leeres Feld bleibt leer und bedeutet nicht festgelegt. Beim Steuersatz heißt leer, dass die Vorgabe des Teams gilt.

Veranstaltungen auflisten

GET /api/flowevents/events

Listet die Veranstaltungen des Teams. Sortiert wird nach dem frühesten Termin; Veranstaltungen ohne Termin stehen am Ende. Der Zeitraum bezieht sich auf die Termine, nicht auf das Anlagedatum.

Query-Parameter:

status string draft, active, cancelled oder closed.
format string offline oder online.
search string Volltextsuche im Titel.
from string Frühester Termin (YYYY-MM-DD).
to string Spätester Termin (YYYY-MM-DD).
per_page integer Einträge je Seite, 1 bis 200. Vorgabe 50.
page integer Seitennummer, ab 1.

Veranstaltung anlegen

POST /api/flowevents/events

Legt eine Veranstaltung samt Terminen und optionalen Posten an. Mindestens ein Termin ist Pflicht. Eine Inhouse-Veranstaltung benötigt eine Firma. Eine neue Veranstaltung ist immer aktiv; der Status lässt sich nicht mitschicken.

Request Body:

title string * Titel, höchstens 255 Zeichen.
description string Beschreibung, höchstens 5000 Zeichen.
format string offline oder online. Vorgabe offline. Bei online werden Zimmer und Verpflegung abgeschaltet.
structure string simple oder multi_part. Bei simple wird nur der erste Termin gespeichert.
booking_mode string open oder inhouse. Vorgabe open. Später unveränderlich.
client_uuid string UUID der buchenden Firma. Pflicht bei booking_mode inhouse.
project_uuid string UUID des Projekts der Firma.
capacity integer Höchstzahl der Plätze. Bei Inhouse ohne Wirkung.
price_regular number Regulärer Seminarpreis.
price_reduced number Ermäßigter Preis.
price_early_bird number Frühbucherpreis.
early_bird_until string Frühbucherfrist (YYYY-MM-DD). Ohne Frühbucherpreis wirkungslos.
seminar_fee_tax_rate number Steuersatz in Prozent. Leer bedeutet Vorgabe des Teams.
prices_include_tax boolean Ob die Preise brutto verstanden werden.
uses_accommodation boolean Ob Kost und Logis genutzt werden.
tracks_homework boolean Ob Hausaufgaben erfasst werden.
signatures_enabled boolean Ob Unterschriften eingeholt werden.
signature_confirmation_text string Bestätigungstext der Unterschriftenseite.
notes string Interne Notizen.
sessions array * Mindestens ein Termin mit starts_at, optional ends_at, venue_uuid und online_access_info.
price_items array Posten mit name, kind, amount, optional tax_rate und is_optional.

Veranstaltung abrufen

GET /api/flowevents/events/{uuid}

Liefert eine Veranstaltung mit ihren Terminen, ihren Posten und dem Anmeldestand je Status.

Veranstaltung ändern

PUT /api/flowevents/events/{uuid}

Ändert eine Veranstaltung. Nicht mitgeschickte Felder bleiben unverändert. Werden sessions oder price_items mitgeschickt, gilt die Liste vollständig. Ein bereits abgerechneter Posten lässt sich nicht entfernen und führt zu HTTP 409.

Request Body:

title string Titel.
format string offline oder online.
structure string simple oder multi_part.
capacity integer Höchstzahl der Plätze.
sessions array Vollständige Terminliste. Vorhandene Termine tragen ihre uuid.
price_items array Vollständige Postenliste. Vorhandene Posten tragen ihre uuid.

Veranstaltung löschen

DELETE /api/flowevents/events/{uuid}

Löscht eine Veranstaltung. Es ist ein weiches Löschen: Teilnehmer, erfasste Anwesenheit und geschriebene Rechnungen behalten ihren Zusammenhang.

Veranstaltung absagen

POST /api/flowevents/events/{uuid}/cancel

Setzt eine aktive Veranstaltung auf abgesagt. Eine Veranstaltung, die nicht aktiv ist, wird mit HTTP 409 abgelehnt. Nach der Absage sind keine Anmeldungen mehr möglich.

Veranstaltung abschliessen

POST /api/flowevents/events/{uuid}/close

Setzt eine aktive Veranstaltung auf abgeschlossen. Eine Veranstaltung, die nicht aktiv ist, wird mit HTTP 409 abgelehnt.

Veranstaltung duplizieren

POST /api/flowevents/events/{uuid}/duplicate

Legt eine Kopie an. Die Kopie ist aktiv, trägt den Zusatz Kopie im Titel und übernimmt die Termine ohne ihre Zeiten, denn der nächste Durchlauf findet an anderen Tagen statt. Teilnehmer werden nicht kopiert, Zimmer eines Tagungshauses schon.

📅 Termine

Ein Termin wechselt nie die Veranstaltung
Termine werden unterhalb ihrer Veranstaltung angelegt und danach über ihren eigenen Pfad geändert. Die Veranstaltung mitzuschicken wird abgelehnt.

Termine einer Veranstaltung auflisten

GET /api/flowevents/events/{uuid}/sessions

Listet alle Termine einer Veranstaltung in ihrer Reihenfolge.

Termin hinzufügen

POST /api/flowevents/events/{uuid}/sessions

Fügt einer Veranstaltung einen Termin hinzu. Zugangsdaten für online werden nur bei einer Online-Veranstaltung gespeichert.

Request Body:

starts_at string * Beginn als Datum oder Zeitstempel.
ends_at string Ende, nicht vor dem Beginn.
title string Bezeichnung des Termins.
venue_uuid string UUID des Tagungshauses.
online_access_info string Zugangsdaten, nur bei Online-Veranstaltungen.
capacity integer Eigene Kapazität des Termins.
guest_price number Preis für Gasthörer je Termin.
sort_order integer Reihenfolge. Ohne Angabe ans Ende.
notes string Interne Notizen.

Termin ändern

PUT /api/flowevents/sessions/{uuid}

Ändert einen Termin. Nicht mitgeschickte Felder bleiben unverändert. Das Ende wird gegen den Beginn geprüft, den der Termin nach dieser Anfrage hat, nicht nur gegen den in dieser Anfrage.

Request Body:

starts_at string Beginn.
ends_at string Ende, nicht vor dem Beginn.
title string Bezeichnung.
venue_uuid string UUID des Tagungshauses, null löst die Zuordnung.
online_access_info string Zugangsdaten, nur bei Online-Veranstaltungen.
capacity integer Eigene Kapazität.
guest_price number Preis für Gasthörer.
sort_order integer Reihenfolge.
notes string Interne Notizen.

Termin löschen

DELETE /api/flowevents/sessions/{uuid}

Löscht einen Termin. Es ist ein weiches Löschen, die erfasste Anwesenheit bleibt erhalten.

🧑‍🎓 Teilnehmer

Ein Teilnehmer ist immer ein CRM-Kunde
FlowEvents führt keine eigenen Namen. Bei der Anmeldung wird eine Momentaufnahme des Kunden gespeichert, damit eine spätere Änderung im CRM die Seminarunterlagen nicht rückwirkend verändert.
Die Frühbucherfrist gewinnt
Ein von Hand übergebener Preis wird nicht blind übernommen. Ist die Frühbucherfrist abgelaufen, gilt der reguläre Preis. Die Antwort sagt über early_bird_fallback_applied, dass das geschehen ist.
Stornieren ist kein Feld
Der Status cancelled wird bei der Änderung abgelehnt. Eine Stornierung storniert die Raten, hebt offene Rechnungen auf und rückt die Warteliste nach; bezahlte Rechnungen bleiben bestehen. Deshalb gibt es dafür einen eigenen Weg.

Teilnehmer auflisten

GET /api/flowevents/participants

Listet Teilnehmer des Teams, neueste Anmeldung zuerst, wahlweise auf eine Veranstaltung, einen Status oder eine Rolle eingegrenzt.

Query-Parameter:

event_uuid string Nur Teilnehmer dieser Veranstaltung.
status string registered, confirmed, waitlisted oder cancelled.
role string regular oder guest_listener.
per_page integer Einträge je Seite, 1 bis 200. Vorgabe 50.
page integer Seitennummer, ab 1.

Teilnehmer anmelden

POST /api/flowevents/events/{uuid}/participants

Meldet einen CRM-Kunden auf einer Veranstaltung an. Ob ein Platz oder die Warteliste herauskommt, entscheidet die Kapazität und steht im zurückgegebenen Status. Eine zweite aktive Anmeldung desselben Kunden wird mit HTTP 409 abgelehnt.

Request Body:

client_uuid string * UUID des CRM-Kunden.
role string regular oder guest_listener. Vorgabe regular.
price_tier string regular, reduced oder early_bird. Vorgabe regular.
assigned_price number Abweichender Preis. Die Frühbucherfrist gewinnt darüber.
remarks string Bemerkungen.
session_uuids array Gebuchte Termine eines Gasthörers.
price_item_uuids array Gebuchte Posten. Ohne Angabe gelten alle nicht optionalen Posten.
price_item_overrides object Abweichende Beträge je Posten-UUID.

Teilnehmer abrufen

GET /api/flowevents/participants/{uuid}

Liefert einen Teilnehmer mit seiner Veranstaltung, seinem Zimmer und seinen gebuchten Posten.

Teilnehmer ändern

PUT /api/flowevents/participants/{uuid}

Ändert einen Teilnehmer. Der Status cancelled wird abgelehnt. Ein Wechsel von regulär auf Gasthörer, der erfasste Anwesenheit verwerfen würde, verlangt confirm_attendance_loss. Ein Nachrücken von der Warteliste wird gegen die Kapazität geprüft.

Request Body:

status string registered, confirmed oder waitlisted.
role string regular oder guest_listener.
price_tier string Preisstufe.
assigned_price number Abweichender Preis. Bei einem Gasthörer immer leer.
remarks string Bemerkungen.
dietary_notes string Hinweise zur Verpflegung.
bed_linen_required boolean Ob Bettwäsche gebraucht wird.
certification_status string none, first_graduation oder final_certificate.
confirm_attendance_loss boolean Bestätigt den Verlust erfasster Anwesenheit beim Rollenwechsel.
session_uuids array Gebuchte Termine eines Gasthörers.
price_item_uuids array Gebuchte Posten.
price_item_overrides object Abweichende Beträge je Posten-UUID.

Teilnahme bestätigen

POST /api/flowevents/participants/{uuid}/confirm

Setzt einen Teilnehmer auf bestätigt. Ein stornierter Teilnehmer wird mit HTTP 409 abgelehnt.

Teilnehmer stornieren

POST /api/flowevents/participants/{uuid}/cancel

Storniert einen Teilnehmer. Die Raten werden storniert, offene Rechnungen aufgehoben und der nächste Wartende rückt nach. Bezahlte Rechnungen bleiben bestehen. Die Antwort nennt die Zahlen und, falls vorhanden, den nachgerückten Teilnehmer.

Von der Warteliste nachrücken

POST /api/flowevents/participants/{uuid}/promote

Rückt einen Wartenden von Hand nach. Eine Kapazitätsprüfung findet bewusst nicht statt: Wer hier nachrückt, überschreitet die Obergrenze wissentlich. Ein Teilnehmer, der nicht auf der Warteliste steht, wird mit HTTP 409 abgelehnt.

Gebuchte Posten abrufen

GET /api/flowevents/participants/{uuid}/price-items

Listet die von diesem Teilnehmer gebuchten Posten mit dem tatsächlich geltenden Betrag. Ohne abweichenden Betrag gilt der Betrag der Veranstaltung.

Gebuchte Posten setzen

PUT /api/flowevents/participants/{uuid}/price-items

Setzt die Postenauswahl eines Teilnehmers. Die Liste ersetzt die Auswahl vollständig; ein Posten, der bereits auf einer Rechnung steht, lässt sich nicht abwählen und führt zu HTTP 409. Posten fremder Veranstaltungen werden verworfen.

Request Body:

price_item_uuids array * Die vollständige Auswahl. Eine leere Liste bucht alles ab.
price_item_overrides object Abweichende Beträge, nach Posten-UUID geschlüsselt.

Rechnung für einen Teilnehmer erstellen

POST /api/flowevents/participants/{uuid}/invoice

Erstellt eine Rechnung über die ausgewählten Posten. postens benennt nur, was abgerechnet wird, nie wie viel: jeder Betrag und jeder Steuersatz wird serverseitig aus der eigenen Veranstaltung des Teilnehmers gelesen. Ohne FlowAccounting, bei bestehendem Ratenplan, bei einem bereits abgerechneten Posten oder ohne Rechnungsempfänger antwortet der Aufruf mit HTTP 409 und nennt den Grund.

Request Body:

postens array * Liste aus seminar_fee und den UUIDs der abzurechnenden Posten, höchstens 20 Einträge.

Abrechnungsbild einer Veranstaltung abrufen

GET /api/flowevents/events/{uuid}/billing

Liefert den Abrechnungsstand aller Teilnehmer einer Veranstaltung in einem Aufruf: Zahlungsstatus, vereinbarter Preis, Zahlart und die zugehörigen Abrechnungsposten samt Rechnungsnummern. Zusätzlich die Posten der Veranstaltung selbst, die zu keinem Teilnehmer gehören, etwa die Firmenrechnung einer Inhouse-Veranstaltung. Benötigt FlowAccounting und antwortet sonst mit HTTP 403.

Abrechnungsposten und Raten abrufen

GET /api/flowevents/participants/{uuid}/installments

Listet die Abrechnungsposten eines Teilnehmers samt Ratenplan. Eine Rate gibt es, bevor es ihre Rechnung gibt: invoice_uuid bleibt leer, bis der Lauf die Rechnung schreibt. Das ist der Normalzustand einer künftigen Rate und kein Fehler.

✅ Anwesenheit

Drei Zustände, nicht zwei
true heißt anwesend beziehungsweise abgegeben, false heißt ausdrücklich das Gegenteil, und null heißt, dass noch niemand etwas gesagt hat. Eine nie berührte Zelle ist null und nicht false.
Gasthörer nur in gebuchten Terminen
Ein Gasthörer bucht einzelne Termine, und die Buchung ist genau die Anwesenheitszeile. Eine Zelle für einen nicht gebuchten Termin zu schreiben würde eine Buchung erfinden und wird mit HTTP 409 abgelehnt.

Anwesenheitsraster abrufen

GET /api/flowevents/events/{uuid}/attendance

Liefert das vollständige Raster einer Veranstaltung: alle Termine, alle aktiven Teilnehmer und je Kombination den Anwesenheits- und Hausaufgabenzustand.

Anwesenheit erfassen

PUT /api/flowevents/participants/{uuid}/attendance/{sessionUuid}

Schreibt eine Zelle des Rasters. Ein nicht mitgeschicktes Feld bleibt unberührt, ein ausdrückliches null setzt es auf nicht erfasst zurück. Hausaufgaben lassen sich nur erfassen, wenn die Veranstaltung sie führt.

Request Body:

attended boolean true, false oder null.
homework_submitted boolean true, false oder null. Nur bei Veranstaltungen mit Hausaufgaben.
notes string Notiz zur Zelle.

🛏️ Zimmerverteilung

Zwei Arten von Zimmern
Ein Zimmer gehört entweder zu einem Tagungshaus und wird einer Veranstaltung nur zur Verfügung gestellt, oder die Veranstaltung erfindet es für diesen einen Anlass. Nur das zweite verschwindet wieder, wenn die Veranstaltung es freigibt.
Überbelegung muss ausdrücklich bestätigt werden
Eine Zuteilung in ein volles Zimmer antwortet mit HTTP 409 und nennt Belegung und Kapazität. Dieselbe Anfrage mit confirm_overbooking schreibt ohne Kapazitätsprüfung.

Zimmer einer Veranstaltung auflisten

GET /api/flowevents/events/{uuid}/rooms

Listet die Zimmer dieser Veranstaltung mit der für sie geltenden Kapazität und der aktuellen Belegung.

Zimmer zur Veranstaltung hinzufügen

POST /api/flowevents/events/{uuid}/rooms

Stellt vorhandene Zimmer einer Veranstaltung zur Verfügung. Der Aufruf ist wiederholbar: ein bereits zugeordnetes Zimmer behält seine Zuordnung und seine abweichende Kapazität.

Request Body:

room_uuids array * UUIDs der Zimmer, mindestens eine.

Zimmer für diese Veranstaltung anlegen

POST /api/flowevents/events/{uuid}/rooms/ad-hoc

Legt ein Zimmer an, das zu keinem Tagungshaus gehört und nur für diese Veranstaltung gedacht ist. Genau deshalb lässt es sich später wieder vollständig entfernen.

Request Body:

name string * Bezeichnung des Zimmers.
room_type string * single, double oder multi.
capacity integer * Anzahl der Betten, 1 bis 999.

Abweichende Kapazität setzen

PUT /api/flowevents/events/{uuid}/rooms/{roomUuid}/capacity

Setzt die Kapazität, die dieses Zimmer für diese eine Veranstaltung hat. Die Abweichung hängt an der Zuordnung und nicht am Zimmer, ein Doppelzimmer wird dadurch nicht dauerhaft zum Einzelzimmer. null stellt die eigene Kapazität des Zimmers wieder her.

Request Body:

capacity_override integer * 1 bis 999 oder null.

Zimmer von der Veranstaltung entfernen

DELETE /api/flowevents/events/{uuid}/rooms/{roomUuid}

Nimmt ein Zimmer von der Veranstaltung. Alle darin untergebrachten Teilnehmer verlieren zuerst ihren Platz. Ein eigens angelegtes Zimmer wird dabei gelöscht, ein Zimmer eines Tagungshauses bleibt bestehen.

Teilnehmer einem Zimmer zuteilen

PUT /api/flowevents/participants/{uuid}/room

Teilt einen Teilnehmer einem Zimmer zu oder nimmt ihn heraus. room_uuid ist Pflicht und darf null sein; null hebt die Zuteilung auf. Ein volles Zimmer antwortet mit HTTP 409 samt Belegung und Kapazität, mit confirm_overbooking wird trotzdem geschrieben.

Request Body:

room_uuid string * UUID des Zimmers oder null zum Herausnehmen.
confirm_overbooking boolean Bestätigt eine Überbelegung ausdrücklich.

🏨 Tagungshäuser und Zimmer

Ein Zimmer wechselt nie sein Haus
Das Tagungshaus wird beim Anlegen über den Pfad bestimmt und lässt sich nicht nachträglich ändern. Ein Umzug würde alle darin untergebrachten Teilnehmer stillschweigend mitnehmen.

Tagungshäuser auflisten

GET /api/flowevents/venues

Listet die Tagungshäuser des Teams mit ihren Zimmern, nach Name sortiert.

Query-Parameter:

search string Suche in Name und Ort.
per_page integer Einträge je Seite, 1 bis 200. Vorgabe 50.
page integer Seitennummer, ab 1.

Tagungshaus anlegen

POST /api/flowevents/venues

Legt ein Tagungshaus an.

Request Body:

name string * Name des Hauses.
address string Anschrift, höchstens 500 Zeichen.
city string Ort.
country string Land.
notes string Interne Notizen.

Tagungshaus abrufen

GET /api/flowevents/venues/{uuid}

Liefert ein Tagungshaus mit seinen Zimmern.

Tagungshaus ändern

PUT /api/flowevents/venues/{uuid}

Ändert ein Tagungshaus. Nicht mitgeschickte Felder bleiben unverändert.

Request Body:

name string Name des Hauses.
address string Anschrift.
city string Ort.
country string Land.
notes string Interne Notizen.

Tagungshaus löschen

DELETE /api/flowevents/venues/{uuid}

Löscht ein Tagungshaus. Es ist ein weiches Löschen; die Zimmer bleiben unverändert bestehen, damit keine bestehende Zuteilung stillschweigend aufgelöst wird.

Zimmer eines Tagungshauses auflisten

GET /api/flowevents/venues/{uuid}/rooms

Listet die Zimmer eines Tagungshauses, nach Name sortiert.

Zimmer anlegen

POST /api/flowevents/venues/{uuid}/rooms

Legt ein Zimmer in einem Tagungshaus an.

Request Body:

name string * Bezeichnung des Zimmers.
room_type string * single, double oder multi.
capacity integer * Anzahl der Betten, 1 bis 999.

Zimmer ändern

PUT /api/flowevents/rooms/{uuid}

Ändert ein Zimmer. Das Tagungshaus lässt sich nicht wechseln und wird abgelehnt, wenn es mitgeschickt wird.

Request Body:

name string Bezeichnung.
room_type string single, double oder multi.
capacity integer Anzahl der Betten, 1 bis 999.

Zimmer löschen

DELETE /api/flowevents/rooms/{uuid}

Löscht ein Zimmer. Es ist ein weiches Löschen.

✉️ Unterschriften und Feedback

Der Feedback-Versand friert das Formular ein
Beim Versand wird eine Kopie der lebenden Fassung geschrieben, und alle Empfänger beantworten diese Kopie. Genau das hält eine Auswertung lesbar, nachdem die Fragen umformuliert wurden. Ein zweiter Versand erzeugt eine zweite Fassung.
Ohne E-Mail-Adresse entsteht trotzdem ein Link
Für jeden Empfänger wird ein Token geschrieben, auch wenn keine Adresse ermittelbar ist. Der Link existiert dann und lässt sich auf anderem Weg übergeben. Die Antwort nennt die Zahl dieser Fälle.

Unterschriften anfordern

POST /api/flowevents/events/{uuid}/signatures/send

Verschickt die Unterschriften-Mails. Mit scope unsigned erhalten nur die Teilnehmer eine Mail, die noch nicht unterschrieben haben, mit all alle erneut. Die Antwort nennt die erzeugten Token, die eingereihten Mails und die Empfänger ohne Adresse.

Request Body:

scope string unsigned oder all. Vorgabe unsigned.

Feedback anfordern

POST /api/flowevents/events/{uuid}/feedback/send

Verschickt die Feedback-Mails zu einem Formular und friert dabei eine Fassung des Formulars ein. Mit scope pending erhalten nur die Teilnehmer eine Mail, die noch nicht geantwortet haben.

Request Body:

form_uuid string * UUID des Feedback-Formulars.
scope string pending oder all. Vorgabe pending.

Feedback einer Veranstaltung auswerten

GET /api/flowevents/events/{uuid}/feedback/evaluation

Wertet die Rückmeldungen zu einer Veranstaltung aus, gruppiert nach der Frage und nicht nach der Fassung. Inhaltlich dieselbe Antwort wie die Auswertung unter reports, nur über die Veranstaltung im Pfad adressiert.

📝 Feedback-Formulare

Geschrieben wird immer die lebende Fassung
Ein Formular hat Fassungen, und nur die neueste ist bearbeitbar. Alle Schreibwege hier wirken auf sie. Die eingefrorenen Fassungen tragen die Formulierung, unter der ihre Antworten gegeben wurden, und werden nie wieder verändert.
Beantwortete Formulare lassen sich nicht löschen
Sobald zu einem Formular Antworten vorliegen, wird das Löschen mit HTTP 409 abgelehnt. Sonst stünden die Antworten ohne ihre Fragen da.
options folgt dem Feldtyp
Bei select, radio und checkbox ist options eine Liste von Antworttexten, bei rating ein Objekt mit dem höchsten Stern, bei allen anderen Typen leer. Der Feldtyp selbst lässt sich nachträglich nicht ändern.

Feedback-Formulare auflisten

GET /api/flowevents/feedback-forms

Listet die Feedback-Formulare des Teams mit der Nummer ihrer lebenden Fassung und der Zahl ihrer Felder.

Query-Parameter:

search string Suche in Name und Beschreibung.
per_page integer Einträge je Seite, 1 bis 200. Vorgabe 50.
page integer Seitennummer, ab 1.

Feedback-Formular anlegen

POST /api/flowevents/feedback-forms

Legt ein Formular an. Fassung 1 wird sofort mitangelegt, sodass das Formular vom ersten Moment an bearbeitbar ist.

Request Body:

name string * Name des Formulars.
description string Beschreibung, höchstens 1000 Zeichen.

Feedback-Formular abrufen

GET /api/flowevents/feedback-forms/{uuid}

Liefert ein Formular mit den Feldern seiner lebenden Fassung in ihrer Reihenfolge.

Feedback-Formular ändern

PUT /api/flowevents/feedback-forms/{uuid}

Ändert Name oder Beschreibung eines Formulars. Nicht mitgeschickte Felder bleiben unverändert.

Request Body:

name string Name des Formulars.
description string Beschreibung.

Feedback-Formular löschen

DELETE /api/flowevents/feedback-forms/{uuid}

Löscht ein Formular. Liegen bereits Antworten vor, wird das Löschen mit HTTP 409 abgelehnt, weil die Antworten sonst ohne ihre Fragen dastünden.

Felder eines Formulars auflisten

GET /api/flowevents/feedback-forms/{uuid}/fields

Listet die Felder der lebenden Fassung in ihrer Reihenfolge.

Feld hinzufügen

POST /api/flowevents/feedback-forms/{uuid}/fields

Fügt der lebenden Fassung ein Feld hinzu. Der Feldtyp ist Pflicht und lässt sich später nicht mehr ändern. Ohne weitere Angaben gelten die Vorgaben des Typs.

Request Body:

field_type string * text, textarea, select, checkbox, radio, rating, section_heading oder paragraph.
label string Beschriftung, höchstens 255 Zeichen.
help_text string Hilfetext, höchstens 1000 Zeichen.
is_required boolean Ob eine Antwort verlangt wird.
options array Antworttexte bei select, radio und checkbox; bei rating ein Objekt mit max zwischen 2 und 10.

Felder neu anordnen

PUT /api/flowevents/feedback-forms/{uuid}/fields/order

Setzt die Reihenfolge der Felder. Die Liste ist die neue Reihenfolge vollständig; eine UUID, die zu einem anderen Formular gehört, wird verworfen.

Request Body:

field_uuids array * UUIDs der Felder in der gewünschten Reihenfolge.

Feld ändern

PUT /api/flowevents/feedback-forms/{uuid}/fields/{fieldUuid}

Ändert Beschriftung, Hilfetext, Pflichtangabe oder Antwortmöglichkeiten eines Feldes. Der Feldtyp lässt sich nicht ändern und wird abgelehnt, wenn er mitgeschickt wird. Ein Stern-Höchstwert wird auf den erlaubten Bereich begrenzt.

Request Body:

label string Beschriftung.
help_text string Hilfetext.
is_required boolean Ob eine Antwort verlangt wird.
options array Antworttexte oder, bei rating, ein Objekt mit max.

Feld löschen

DELETE /api/flowevents/feedback-forms/{uuid}/fields/{fieldUuid}

Löscht ein Feld aus der lebenden Fassung. Bereits eingefrorene Fassungen und die zu ihnen gegebenen Antworten bleiben unberührt.

📄 Exporte

Drei Exporte brauchen FlowAccounting
Kosten und Zahlung, Gesamtübersicht und die Feedback-Liste enthalten Geldbeträge und sind deshalb an FlowAccounting gebunden. Ohne das Modul antworten sie mit HTTP 403, während die Veranstaltung selbst weiterhin sichtbar bleibt.
Antwort ist die Datei selbst
Jeder Export liefert eine CSV-Datei mit Semikolon als Trennzeichen und einer UTF-8-Kennung am Anfang, damit Tabellenprogramme Umlaute richtig lesen. Ohne Angabe von statuses werden die angemeldeten und die bestätigten Teilnehmer ausgegeben.

Kontaktliste exportieren

GET /api/flowevents/events/{uuid}/exports/contacts SSE / Streaming CSV

Liefert die Kontaktliste als CSV: Name, E-Mail, Telefon, Firma, Adresse, Rolle und Bemerkungen. Diese Liste enthält bewusst keine Geldbeträge und braucht deshalb kein FlowAccounting.

Query-Parameter:

statuses array registered, confirmed, waitlisted, cancelled. Vorgabe registered und confirmed.

Zimmerliste exportieren

GET /api/flowevents/events/{uuid}/exports/rooms SSE / Streaming CSV

Liefert die Zimmerliste als CSV: Name, Zimmer, Zimmertyp, Sonderkost und Bettwäsche. Nutzt die Veranstaltung keine Unterbringung, antwortet der Aufruf mit HTTP 409 statt mit einer leeren Datei.

Query-Parameter:

statuses array registered, confirmed, waitlisted, cancelled. Vorgabe registered und confirmed.

Kosten und Zahlung exportieren

GET /api/flowevents/events/{uuid}/exports/cost-payment SSE / Streaming CSV

Liefert Seminargebühr, Preisstufe, Kost und Logis, Gesamtbetrag und Zahlungsstatus als CSV. Benötigt FlowAccounting. Bei einer Inhouse-Veranstaltung enthält die Datei die Firmensumme statt einer Zeile je Teilnehmer.

Query-Parameter:

statuses array registered, confirmed, waitlisted, cancelled. Vorgabe registered und confirmed.

Gesamtübersicht exportieren

GET /api/flowevents/events/{uuid}/exports/full SSE / Streaming CSV

Liefert alle Spalten in einer Datei: Kontaktdaten, Rolle, Preise, Zahlungs- und Zertifizierungsstatus, Zimmer, Sonderkost, Bettwäsche und Bemerkungen. Benötigt FlowAccounting.

Query-Parameter:

statuses array registered, confirmed, waitlisted, cancelled. Vorgabe registered und confirmed.

Feedback-Antworten exportieren

GET /api/flowevents/events/{uuid}/exports/feedback SSE / Streaming CSV

Liefert die abgegebenen Antworten als CSV mit einer Zeile je beantworteter Frage. Benötigt FlowAccounting. Liegen keine Antworten vor, antwortet der Aufruf mit HTTP 409 statt mit einer Datei, die nur eine Kopfzeile enthält.