Skip to content

Bot Chat API

Die Bot Chat API ermöglicht dir, Bot-Antworten programmatisch abzurufen — ohne Dashboard, ohne WhatsApp. Typische Anwendungsfaelle sind n8n-Workflows, E-Mail-Processing oder eigene Integrationen.

Endpoint

POST /api/bot-chat/:botId/chat

Mount-Pfad in server.js:

js
app.use('/api/bot-chat', require('./routes/botChatRoutes'));

Authentifizierung

Alle Requests werden über die apiKeyAuth-Middleware authentifiziert. Du brauchst einen Tenant API Key (Prefix via_), der in der Tabelle tenant_api_keys als bcrypt-Hash gespeichert ist.

Der Key kann auf zwei Arten übergeben werden:

MethodeHeader
Bearer TokenAuthorization: Bearer via_XXXXXXXX_...
Custom Headerx-api-key: via_XXXXXXXX_...

Die Middleware prueft:

  1. Key-Prefix (erste 12 Zeichen) gegen tenant_api_keys.key_prefix
  2. bcrypt-Vergleich gegen key_hash
  3. is_active = true
  4. expires_at nicht abgelaufen

Bei Erfolg wird req.tenantId und req.apiKeyId gesetzt.

Rate Limiting

ParameterWert
Fenster60 Sekunden
Max. Requests60 pro Fenster
KeyapiKeyId (Fallback: IP)
Standard-HeadersRateLimit-* (RFC Draft)
Legacy-Headersdeaktiviert

Bei Überschreitung erhaeltst du:

json
{
  "error": "Rate-Limit erreicht",
  "message": "Maximale Anzahl von 60 Anfragen pro Minute erreicht. Bitte warte kurz."
}

Request

URL-Parameter

ParameterTypPflichtBeschreibung
botIdUUIDJaID des Bots (muss zum Tenant des API Keys gehoeren)

Body (JSON)

FeldTypPflichtBeschreibung
messagestringJaDie Nachricht an den Bot (max. 10.000 Zeichen)
sender_idstringNeinAbsender-Kennung, z.B. E-Mail-Adresse (max. 255 Zeichen)
channelstringNeinKanal-Typ (Default: "api")
conversation_idUUIDNeinBestehende Conversation fortsetzen
metadataobjectNeinZusaetzliche Metadaten (z.B. { "subject": "Anfrage" })

Gültige Channels

js
const VALID_CHANNELS = ['email', 'api', 'webhook'];

Wenn ein ungültiger Channel übergeben wird, faellt der Wert auf "api" zurück.

Response

Erfolg (200)

json
{
  "reply": "Unsere Oeffnungszeiten sind...",
  "conversation_id": "uuid",
  "tokens_used": 123,
  "model": "mistral-medium-latest",
  "knowledge_used": true,
  "quota_remaining": 897,
  "channel": "email"
}
FeldTypBeschreibung
replystringDie Bot-Antwort
conversation_idUUIDID der Conversation (für Folge-Nachrichten)
tokens_usednumberVerbrauchte Tokens für diesen Request
modelstringVerwendetes AI-Modell
knowledge_usedbooleanOb Knowledge-Base-Eintraege in die Antwort eingeflossen sind
quota_remainingnumber | nullVerbleibende Nachrichten im monatlichen Kontingent
channelstringDer verwendete Kanal

Fehler-Codes

HTTPerrorUrsache
400Nachricht erforderlichmessage fehlt, ist leer oder kein String
400Nachricht zu langmessage hat mehr als 10.000 Zeichen
400Ungültige sender_idsender_id ist kein String oder laenger als 255 Zeichen
401API Key erforderlichKein API Key im Header
401Ungültiger API KeyKey nicht gefunden oder Validierung fehlgeschlagen
401API Key abgelaufenexpires_at überschritten
403Bot deaktiviertBot ist nicht aktiv (is_active = false oder status = 'disabled')
404Bot nicht gefundenBot existiert nicht oder gehoert nicht zum Tenant
404Conversation nicht gefundenconversation_id existiert nicht für diesen Bot/Tenant
429Nachrichtenlimit erreichtMonatliches Message-Kontingent aufgebraucht
429Rate-Limit erreichtMehr als 60 Requests/Minute
500Interner FehlerUnerwarteter Server-Fehler

Conversation History

Der Endpoint laedt automatisch die letzten 10 Nachrichten der Conversation als Kontext für die AI. Du kannst eine bestehende Conversation fortsetzen, indem du die conversation_id aus der ersten Response in Folge-Requests mitschickst.

Knowledge Base

Die Knowledge Base wird automatisch durchsucht (Top 3 Ergebnisse). Nur Ergebnisse mit einem Score >= QDRANT_MIN_SCORE (Default: 0.4) fliessen in den Kontext ein. Die Strictness-Stufe des Bots (bot.knowledge_strictness) steuert, wie streng die AI an die KB-Ergebnisse gebunden ist.

Beispiel

bash
curl -X POST https://api.getvia.at/api/bot-chat/BOT_UUID/chat \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer via_XXXXXXXX_dein_api_key" \
  -d '{
    "message": "Wie sind eure Oeffnungszeiten?",
    "sender_id": "kunde@example.com",
    "channel": "email",
    "metadata": { "subject": "Anfrage Oeffnungszeiten" }
  }'

Folge-Nachricht (gleiche Conversation)

bash
curl -X POST https://api.getvia.at/api/bot-chat/BOT_UUID/chat \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer via_XXXXXXXX_dein_api_key" \
  -d '{
    "message": "Und am Wochenende?",
    "conversation_id": "CONVERSATION_UUID_AUS_ERSTER_RESPONSE",
    "channel": "email"
  }'

Dateien

DateiBeschreibung
src/routes/botChatRoutes.jsRoute-Definition + Rate Limiter
src/controllers/botChatController.jsController-Logik
src/middleware/apiKeyAuth.jsAPI Key Authentifizierung