Skip to content

Interactive Messages ​

Interactive Messages sind WhatsApp Buttons und Listen, die der Bot im Gesprächsablauf senden kann. Jeder Block wird in bot_interactive_blocks gespeichert und kann über das Flow-System einem Step zugeordnet werden.

Block-Typen ​

block_typeBeschreibungItemsWhatsApp-Darstellung
buttonsReply Buttons1–3Buttons unter der Nachricht
listInteraktive Liste1–10Aufklappbare Liste mit Einträgen

Trigger-Modi ​

Der trigger_mode bestimmt, wann und wie der Bot den Block sendet:

trigger_modeBeschreibung
checkpointBlock wird an einem definierten Checkpoint im Gespräch ausgelöst
mandatoryBot MUSS den Block senden wenn der Flow-Step erreicht wird
optionalBot ENTSCHEIDET selbst ob der Block zum Kontext passt

Endpoints ​

Alle Endpoints erfordern Auth + Tenant-Check. Basis-Pfad: /api/bots/:botId/blocks

MethodePfadBeschreibung
GET/Alle Blöcke eines Bots laden (sortiert nach sort_order, mit Checkpoint-Info)
GET/:blockIdEinzelnen Block laden
POST/Neuen Block erstellen
PUT/reorderReihenfolge ändern
GET/hybrid-promptHybrid-Flow Prompt generieren
PUT/:blockIdBlock aktualisieren
DELETE/:blockIdBlock löschen

Route-Reihenfolge

/reorder und /hybrid-prompt sind VOR /:blockId definiert (spezifisch vor generisch).

Validierungslimits ​

Felder ​

FeldMax. ZeichenPflichtBeschreibung
block_name50JaTechnischer Name (nur [a-z0-9_])
display_name100JaAnzeigename
body1024JaNachrichtentext
header60NeinKopfzeile
footer60NeinFußzeile
button_text20Nein (Listen)Button-Text zum Öffnen der Liste
ai_hint255NeinHinweis für die KI, wann der Block passt (nur bei trigger_mode='optional')

Items (Buttons) ​

EigenschaftLimit
Mindestanzahl1
Maximalanzahl3
Titel max. Zeichen20

Items (Liste) ​

EigenschaftLimit
Mindestanzahl1
Maximalanzahl10
Titel max. Zeichen24
Beschreibung max. Zeichen72

Item-Struktur ​

Jedes Item benötigt mindestens id (String) und title (String). Bei Listen optional description.

WhatsApp API Limits ​

Diese Limits kommen direkt von der WhatsApp Business API und werden durch DB-Check-Constraints erzwungen:

ConstraintRegel
valid_block_typeNur buttons oder list
valid_items_buttons1–3 Items bei block_type='buttons'
valid_items_list1–10 Items bei block_type='list'
valid_trigger_modeNur checkpoint, optional oder mandatory
valid_block_nameRegex ^[a-z0-9_]+$

Datenbank-Schema ​

bot_interactive_blocks ​

SpalteTypNullableDefaultBeschreibung
iduuidNOT NULLgen_random_uuid()Primary Key
tenant_iduuidNOT NULL—FK auf tenants
bot_iduuidNOT NULL—FK auf bots (CASCADE DELETE)
block_namevarchar(50)NOT NULL—Technischer Name (lowercase, unique pro Bot)
display_namevarchar(100)NOT NULL—Anzeigename
block_typevarchar(10)NOT NULL—buttons oder list
headervarchar(60)NULL—Kopfzeile
bodyvarchar(1024)NOT NULL—Nachrichtentext
footervarchar(60)NULL—Fußzeile
button_textvarchar(20)NULL—Button-Text (nur Listen)
itemsjsonbNOT NULL'[]'Array von Items mit id, title, optional description
trigger_modevarchar(15)NOT NULL'optional'checkpoint, mandatory oder optional
checkpoint_iduuidNULL—FK auf bot_checkpoints
checkpoint_conditionjsonbNULL'{}'Bedingung für Checkpoint-Auslösung
ai_hintvarchar(255)NULL—KI-Hinweis (nur bei optional)
sort_orderintegerNULL0Sortierreihenfolge
is_activebooleanNULLtrueAktiv/Inaktiv
created_attimestamptzNULLCURRENT_TIMESTAMPErstelldatum
updated_attimestamptzNULLCURRENT_TIMESTAMPÄnderungsdatum
trigger_conditiontextNULL—Zusätzliche Auslösebedingung

Unique Constraint: (bot_id, block_name) — ein Block-Name pro Bot.

Indizes:

  • idx_interactive_blocks_bot — btree auf (bot_id, is_active)
  • idx_interactive_blocks_checkpoint — btree auf (checkpoint_id)
  • idx_interactive_blocks_tenant — btree auf (tenant_id)

Fehlerbehandlung ​

HTTP StatusSituation
400Validierungsfehler (Felder, Items, Limits)
404Block oder Checkpoint nicht gefunden
409Block-Name existiert bereits für diesen Bot (Unique Constraint)
500Interner Fehler