Schnittstelle: Integration
Mit einem API-Schlüssel Gespräche, Anfragen, Termine und Kennzahlen lesen, Anfragen und Wissensquellen anlegen und den Chat als Ereignisstrom nutzen.
In einfacher Sprache
Über diese Wege verbinden Sie Ihre eigenen Systeme mit dem Dienst. Sie brauchen dafür einen Schlüssel. Damit lesen Sie Gespräche, Anfragen, Termine und Kennzahlen. Sie legen auch Anfragen und Quellen für das Wissen an. Sie können einem Assistenten Fragen stellen. Die Antwort kommt dann Stück für Stück zurück. Jeder Weg prüft, ob der Schlüssel ihn nutzen darf.
Alle Themen der Dokumentation
Die Integrationsschnittstelle verbindet Ihre eigenen Systeme mit XICBOT. Mit einem API-Schlüssel lesen Sie Gespräche, Anfragen, Termine und Kennzahlen, legen Anfragen und Wissensquellen an und stellen einem Assistenten Fragen, deren Antwort als Ereignisstrom zurückkommt. Jeder Weg liegt unter /api/v1/integration/ und prüft den Bereich des Schlüssels für sich.
Überblick
Die Schnittstelle erreichen Sie unter https://app.xicbot.de/api/v1/integration/. Jede Anfrage trägt den Schlüssel im Kopf X-Api-Key; ein Schlüssel beginnt mit xbot_. Wie Sie einen Schlüssel anlegen, seine Bereiche wählen und ihn ablaufen lassen, steht unter Schlüssel und Webhooks, das Anmeldeverfahren unter Anmeldung. Die Integrationswege liegen außerhalb der Sitzungsanmeldung der App: ein Sitzungstoken öffnet sie nicht.
| Weg | Bereich | Bezeichnung in der App |
|---|---|---|
GET /status | keiner | – |
GET /conversations, GET /conversations/{id} | conversations | Gespräche lesen |
GET /leads | leads | Anfragen lesen |
POST /leads | leads.write | Anfragen anlegen |
GET /appointments | appointments | Termine lesen |
GET /analytics | analytics | Auswertung lesen |
POST /knowledge/sources | knowledge.write | Wissensquellen anlegen |
POST /chat | chat | Chat verwenden |
Schreiben ist ein eigener Bereich: ein Schlüssel mit leads liest Anfragen, legt aber keine an. In der App steht dazu unter Bereiche der Satz *Schreiben ist ein eigener Bereich. Ohne ihn liest ein Schlüssel nur.*
Fehler, die jeder Weg kennt
Bevor ein Weg seine eigentliche Arbeit beginnt, prüft die Schnittstelle Schlüssel, Konto, Paket, Drossel und Bereich. Fehler kommen als JSON mit dem Feld error.
| Status | error | Bedeutung |
|---|---|---|
400 | key_in_url | Der Schlüssel stand als api_key oder key in der Adresse. Die Anfrage wird abgewiesen, bevor der Schlüssel nachgeschlagen wird; das Feld note sagt, wohin er gehört. |
401 | key_missing | Der Kopf X-Api-Key fehlt, ist leer oder beginnt nicht mit xbot_. |
401 | invalid_key | Schlüssel unbekannt, zurückgezogen oder abgelaufen. Die drei Fälle antworten gleich. |
403 | tenant_suspended | Das Konto des Schlüssels ist nicht aktiv. |
402 | plan_feature_missing | Das Paket des Kontos enthält die Funktion für Schlüssel und Webhooks nicht, etwa nach einem Tarifwechsel. feature, plan, plan_name und available_in nennen das Merkmal, das Paket und die Pakete, die es enthalten. Der Schlüssel bleibt gültig und arbeitet wieder, sobald das Paket die Funktion enthält; die Anfrage zählt auf keinem Deckel. |
429 | too_many_requests | Minuten- oder Tagesdeckel des Schlüssels erreicht, siehe Drosselung. |
403 | scope_missing | Dem Schlüssel fehlt der Bereich, den der Weg verlangt, etwa leads oder chat. Das Feld required nennt ihn. |
403 | read_only | Der Weg schreibt, und dem Schlüssel fehlt der schreibende Bereich (leads.write oder knowledge.write). Das Feld required nennt ihn. |
422 | – | Eine Eingabe hat die Feldprüfung nicht bestanden. Die Antwort trägt message und unter errors die Fehler je Feld. |
500 | – | Serverfehler. message lautet dann Serverfehler; Klassenname, Datei, Zeile und Aufrufweg stehen nicht in der Antwort. |
Drosselung
Jeder Schlüssel hat einen Minutendeckel, den Sie beim Anlegen unter Anfragen pro Minute eintragen, und einen Tagesdeckel aus den Einstellungen Ihres Kontos; beide zählen je Schlüssel. Ist einer erreicht, antwortet der Weg mit 429 und too_many_requests. Werte, Zeitfenster und die Felder der Antwort stehen unter Paketsperren und Drosseln.
Seitenweise lesen
Die Listen für Gespräche, Anfragen und Termine liefern 50 Einträge je Seite. Gespräche und Anfragen stehen nach Anlage geordnet, die jüngsten zuerst; Termine nach Beginn, die spätesten zuerst. Die Seite wählen Sie mit page, gezählt ab 1; ein fehlender oder kleinerer Wert gilt als 1, ein Wert, der keine ganze Zahl ist, wird mit 422 abgewiesen. Die Antwort wiederholt die Seite im Feld page und nennt keine Gesamtzahl. Lesen Sie weiter, bis eine Seite weniger als 50 Einträge hat.
Status
GET /api/v1/integration/status
Sagt, was der Schlüssel darf, und liest keine Daten. Damit prüfen Sie eine Anbindung, ohne einen Bereich zu brauchen.
- Anmeldung
- Kopf
X-Api-Key, kein Bereich - Begrenzung
- Minuten- und Tagesdeckel des Schlüssels, siehe Drosselung
| Feld | Inhalt |
|---|---|
alive | true, sobald die Anfrage die Prüfung bestanden hat |
tenant | Kennung Ihres Kontos |
scopes | Bereiche des Schlüssels als Liste |
limit_per_min | Minutendeckel des Schlüssels |
Befehl in der Schale bash
curl -s https://app.xicbot.de/api/v1/integration/status \
-H "X-Api-Key: $XICBOT_KEY"
# {"alive":true,"tenant":"…","scopes":["leads","leads.write"],"limit_per_min":120}Gespräche
GET /api/v1/integration/conversations
Listet die Gespräche Ihres Kontos aus allen Kanälen, 50 je Seite, die jüngsten zuerst. Was ein Gespräch in der App ausmacht, beschreibt Gespräche.
- Anmeldung
- Kopf
X-Api-Key, Bereichconversations - Begrenzung
- Minuten- und Tagesdeckel des Schlüssels, siehe Drosselung
| Parameter | Pflicht | Inhalt |
|---|---|---|
page | nein | Ganze Zahl, Seite ab 1, Vorgabe 1 |
Feld in conversations[] | Inhalt |
|---|---|
id | Kennung des Gesprächs |
assistant_id | Kennung des Assistenten |
channel | widget (Chatfenster auf einer Website), api (über POST /chat begonnen) oder test (Test in der App) |
title | aus der ersten Frage gebildet, höchstens 120 Zeichen, bei Kürzung mit … am Ende |
status | open, closed oder escalated |
message_count | Zahl der Nachrichten |
created | Beginn als ISO-8601-Zeitpunkt |
GET /api/v1/integration/conversations/{id}
Liefert ein Gespräch mit seinem Verlauf: höchstens 200 Nachrichten in zeitlicher Reihenfolge. Eine Kennung aus einem anderen Konto findet nichts und antwortet wie eine unbekannte.
- Anmeldung
- Kopf
X-Api-Key, Bereichconversations - Begrenzung
- Minuten- und Tagesdeckel des Schlüssels, siehe Drosselung
| Feld | Inhalt |
|---|---|
conversation | dieselben Felder wie in der Liste |
messages[].role | user (Frage von Besucher oder Aufrufer), assistant (Antwort des Assistenten) oder operator (Nachricht eines Menschen aus Ihrem Team) |
messages[].text | Text der Nachricht im Klartext |
messages[].time | Zeitpunkt als ISO-8601 |
| Status | error | Bedeutung |
|---|---|---|
404 | not_found | Kein Gespräch mit dieser Kennung in Ihrem Konto. |
Anfragen
Anfragen sind Kontaktwünsche. Sie entstehen im Gespräch mit einem Assistenten oder über diese Schnittstelle. Legt ein Assistent eine Anfrage über ein Werkzeug an, löst das ebenfalls den Webhook lead.created aus, mit anderer Nutzlast als hier, siehe Ausgelöste Webhooks. In der App bearbeiten Sie Anfragen unter Termine und Vorgänge.
GET /api/v1/integration/leads
Listet die Anfragen Ihres Kontos, 50 je Seite, die jüngsten zuerst. Die Seite wählen Sie mit page.
- Anmeldung
- Kopf
X-Api-Key, Bereichleads - Begrenzung
- Minuten- und Tagesdeckel des Schlüssels, siehe Drosselung
Feld in leads[] | Inhalt |
|---|---|
id | Kennung der Anfrage |
name, email, phone | Kontaktangaben, jeweils auch leer |
subject | das Anliegen |
source | Herkunft; über die Schnittstelle angelegte Anfragen tragen api, wenn Sie nichts anderes angeben |
status | new (neu), seen (gesehen) oder done (erledigt) |
created | Zeitpunkt der Anlage als ISO-8601 |
POST /api/v1/integration/leads
Legt eine Anfrage an. Sie beginnt mit dem Status new und löst den Webhook lead.created aus.
- Anmeldung
- Kopf
X-Api-Key, Bereichleads.write - Begrenzung
- Minuten- und Tagesdeckel des Schlüssels, siehe Drosselung
| Feld | Pflicht | Regel |
|---|---|---|
subject | ja | Text, höchstens 1000 Zeichen |
name | nein | Text, höchstens 120 Zeichen |
email | nein | gültige E-Mail-Adresse, höchstens 190 Zeichen |
phone | nein | Text, höchstens 60 Zeichen |
source | nein | Text, höchstens 60 Zeichen; Vorgabe api |
external_id | nein | Ihre eigene Kennung, höchstens 100 Zeichen; verhindert Doppeleinträge |
| Status | Antwort | Bedeutung |
|---|---|---|
201 | lead, duplicate_prevented: false | Anfrage neu angelegt, Webhook ausgelöst. |
200 | lead, duplicate_prevented: true | Eine Anfrage mit derselben external_id gab es schon. Zurück kommt die vorhandene; es entsteht keine zweite, und kein Webhook wird ausgelöst. |
422 | message, errors | subject fehlt oder eine Feldregel ist verletzt. |
Termine
GET /api/v1/integration/appointments
Listet die Termine Ihres Kontos, 50 je Seite, nach Beginn geordnet, die spätesten zuerst. Wie Termine entstehen, beschreibt Termine und Vorgänge.
- Anmeldung
- Kopf
X-Api-Key, Bereichappointments - Begrenzung
- Minuten- und Tagesdeckel des Schlüssels, siehe Drosselung
Feld in appointments[] | Inhalt |
|---|---|
id | Kennung des Termins |
type | Bezeichnung der Terminart |
starts_at | Beginn als ISO-8601 |
duration_min | Dauer in Minuten |
name, email | Kontaktangaben |
status | requested (angefragt), confirmed (bestätigt) oder cancelled (abgesagt) |
Kennzahlen
GET /api/v1/integration/analytics
Liefert die Kennzahlen eines Zeitraums für alle Assistenten zusammen. Gespräche aus dem Probierdialog und Prüfgespräche zählen darin nicht mit, wie in der Auswertung. Was die einzelnen Kennzahlen bedeuten, erklärt Auswertung.
- Anmeldung
- Kopf
X-Api-Key, Bereichanalytics - Begrenzung
- Minuten- und Tagesdeckel des Schlüssels, siehe Drosselung
| Parameter | Pflicht | Inhalt |
|---|---|---|
period | nein | 7d, 30d oder 90d; Vorgabe 30d |
zone | nein | Zeitzone nach IANA, etwa Europe/Berlin (Vorgabe) oder America/New_York. Ältere Namen, die Browser noch melden, etwa Asia/Calcutta oder Europe/Kiev, werden angenommen und unter dem heutigen Namen gerechnet (Asia/Kolkata, Europe/Kyiv). Groß- und Kleinschreibung spielen keine Rolle; gerechnet und gemeldet wird unter der üblichen Schreibung, für europe/berlin also Europe/Berlin. Die festen Versätze Etc/GMT+1 bis Etc/GMT+12 und Etc/GMT-1 bis Etc/GMT-14 gelten mit dem Vorzeichen der Zeitzonendatenbank: Etc/GMT+1 liegt eine Stunde hinter UTC. Ein Versatz wie +01:00 gilt nicht als Zone. |
Das Fenster schließt den laufenden Tag ein und endet an der nächsten Mitternacht der angegebenen Zone: 7d umfasst heute und die sechs Tage davor.
| Feld | Inhalt |
|---|---|
period, zone | wie angefragt; in zone steht die übliche Schreibung, für europe/berlin also Europe/Berlin, und bei einem älteren Zonennamen der heutige, für Asia/Calcutta also Asia/Kolkata |
from, to | Grenzen des Fensters als Zeitpunkt in UTC |
days | Zahl der Tage im Fenster |
assistant | null: die Zahlen gelten für alle Assistenten |
cards | die Kennzahlen, je Schlüssel ein Objekt |
| Feld einer Kennzahl | Inhalt |
|---|---|
value | der Wert, Anteile in Prozent; null, wenn nicht gemessen |
measured | true, wenn ein Wert vorliegt |
reason | bei measured: false der Grund: no_conversation, no_reply, no_search, no_probe, no_enforcement_check, no_tool_call oder no_rating |
counter, denominator | bei Anteilen der Zähler und der Nenner |
| Gruppe | Schlüssel in cards |
|---|---|
| Menge | conversations, messages, answered, escalations, abstentions, messages_per_conversation |
| Gesprächsverlauf | escalation_rate, self_resolved, frustration_rate, unanswered, abandoned, abandon_rate |
| Antwortqualität | citation_rate, coverage, retrieval_mrr, retrieval_hit_rate, enforcement_rate, hard_topic_rate, blocked_rate |
| Tempo und Verbrauch | reply_ms_p50, reply_ms_p95, units |
| Werkzeuge | tool_calls, tool_executed, tool_rejected, tool_errors |
| Ergebnisse | leads, appointments, carts |
| Bewertungen der Besucher | visitor_ratings, visitor_helpful_rate, visitor_rating_coverage |
| Status | error | Bedeutung |
|---|---|---|
422 | unknown_timezone | Die Zone ist unbekannt. Die Schnittstelle fällt nicht still auf die Vorgabe zurück. |
422 | – | period hat einen anderen Wert als 7d, 30d oder 90d (message, errors). |
Wissensquellen anlegen
POST /api/v1/integration/knowledge/sources
Legt eine Wissensquelle aus Text oder aus einer Website-Adresse an. Text wird sofort aufgenommen; eine Adresse ruft ein Hintergrundauftrag ab. Wie Quellen in Antworten eingehen, beschreibt Wissen.
- Anmeldung
- Kopf
X-Api-Key, Bereichknowledge.write - Begrenzung
- Minuten- und Tagesdeckel des Schlüssels, siehe Drosselung
| Feld | Pflicht | Regel |
|---|---|---|
title | ja | Text, höchstens 200 Zeichen |
text | ja, wenn url fehlt | Text, höchstens 400000 Zeichen |
url | ja, wenn text fehlt | Adresse mit http oder https, höchstens 500 Zeichen. Stehen url und text in der Anfrage, gilt url. |
draft | nein | true legt den Text als Entwurf an, der in keine Antwort eingeht. Nicht zusammen mit url. |
published_at | nein | Datum der Veröffentlichung. Liegt es in der Zukunft, geht der Text erst ab dann in Antworten ein. Nicht zusammen mit url. |
| Status | Antwort | Bedeutung |
|---|---|---|
201 | source mit id, type: text, status, chunks | Text verarbeitet. status ist ready oder failed. Auch eine gescheiterte Aufnahme antwortet mit 201: die Quelle steht, nur ihre Aufnahme ist gescheitert. |
202 | source mit id, type: website, status: new | Adresse angenommen; der Abruf läuft im Hintergrund. |
422 | error: url_unreadable | Adresse nicht lesbar, etwa ohne Schema oder Host. |
422 | error: scheme_not_allowed | Anderes Schema als http oder https. |
422 | error: name_unresolvable | Der Hostname lässt sich nicht auflösen. |
422 | error: target_not_allowed | Das Ziel ist keine öffentliche Adresse. |
422 | message, errors | Feldregel verletzt, etwa draft zusammen mit url. |
402 | error: plan_limit_reached | Eine Zahlgrenze Ihres Pakets ist erreicht; limit nennt sie (knowledge_sources, documents oder chunks), allowed und used die Zahlen. Angelegt wird nichts. Siehe Paketsperre und Paketgrenzen. |
503 | error: plan_limit_unmeasured | Der Bestand ließ sich nicht zählen; angelegt wird nichts. Versuchen Sie es später erneut. |
Ob ein Website-Abruf gelungen ist, melden die Webhooks knowledge.indexed und knowledge.failed. Im Fehlerfall nennt reason einen benannten Grund, etwa no_text_extracted, url_unreachable, website_too_large oder redirect_off_origin; andere Ursachen erscheinen als ingest_failed. Der Abruf bekommt bis zu drei Versuche, und jeder gescheiterte Versuch meldet knowledge.failed. Für dieselbe source_id können darum mehrere Ereignisse eintreffen, auch ein knowledge.indexed nach einem knowledge.failed; maßgeblich ist das jüngste.
Chat
POST /api/v1/integration/chat
Stellt einem Assistenten eine Frage. Ohne conversation_id entsteht ein neues Gespräch im Kanal api. Die Antwort kommt als Ereignisstrom (text/event-stream) auf demselben Weg wie in der App.
- Anmeldung
- Kopf
X-Api-Key, Bereichchat - Begrenzung
- Deckel des Schlüssels, dazu das Monatskontingent Ihres Kontos
| Feld | Pflicht | Regel |
|---|---|---|
assistant_id | ja | Kennung des Assistenten, höchstens 64 Zeichen. Geantwortet wird mit seiner jüngsten Fassung. |
conversation_id | nein | Gespräch fortsetzen, höchstens 64 Zeichen. Nur Gespräche, die derselbe Assistent über diese Schnittstelle begonnen hat. |
text | ja | Die Frage, 1 bis 4000 Zeichen. Ist für Ihr Konto eine kleinere Höchstlänge hinterlegt, gilt diese. |
| Status | error | Bedeutung |
|---|---|---|
404 | not_found | Assistent unbekannt, oder das Gespräch gehört nicht zu diesem Assistenten oder nicht zum Kanal api. |
422 | no_version | Der Assistent hat noch keine Fassung. |
409 | reply_in_progress | In diesem Gespräch läuft bereits eine Antwort. |
413 | input_too_long | Die Frage ist länger als die Höchstlänge Ihres Kontos; limit und length nennen beide Werte. |
429 | quota_exhausted | Das Monatskontingent ist verbraucht. scope ist month, dazu kommen month, budget, used und retry_after: die Sekunden bis zum Monatsanfang, auch im Kopf Retry-After. |
422 | – | Feldregel verletzt (message, errors). |
Das Kontingent erklärt Pakete und Kontingente. Ein Gespräch führt höchstens eine Antwort gleichzeitig; bricht ein Lauf ab, ist das Gespräch nach 180 Sekunden wieder frei. Auch ein Gespräch, das in der App als erledigt markiert ist, lässt sich fortsetzen, und die Frage öffnet es wieder: war es übergeben (escalated_at gesetzt), wird es escalated mit neuem escalated_at und liegt wieder im Postfach, sonst wird es open; resolved_at wird leer. Ein Ereignis geht dabei nicht hinaus, und eine abgewiesene Frage öffnet nichts. Als Herkunft eines neuen Gesprächs gilt der Host aus dem Kopf Origin oder Referer, falls Ihr Aufruf einen davon sendet; sonst bleibt sie leer.
Ereignisstrom
Die Antwort hat den Typ text/event-stream; charset=utf-8 und wird ohne Zwischenspeicher ausgeliefert (Cache-Control: no-cache, no-store). Jedes Ereignis besteht aus einer Zeile event: mit der Art und einer Zeile data: mit einem JSON-Objekt, gefolgt von einer Leerzeile. Die Kennung eines neuen Gesprächs steht im ersten Ereignis start; merken Sie sie sich für Folgefragen.
Befehl in der Schale bash
curl -N https://app.xicbot.de/api/v1/integration/chat \
-H "X-Api-Key: $XICBOT_KEY" \
-H "Content-Type: application/json" \
-d '{"assistant_id": "…", "text": "Welche Öffnungszeiten gelten?"}'
event: start
data: {"conversation_id":"…","question_id":null}
event: text
data: {"t":"Wir sind montags bis freitags "}
event: text
data: {"t":"für Sie da."}
event: end
data: {"state":"done","message_id":"…",…}| Ereignis | Felder | Bedeutung |
|---|---|---|
start | conversation_id, question_id | Beginn der Antwort; nennt das Gespräch. |
text | t | Das nächste Textstück der Antwort. Auch nachgereichte Hinweise und die Notfallantwort kommen als text. |
citations | citations mit number, chunk_id, document, heading, excerpt | Die Belege, auf die eine fertige Antwort mit ihrer Nummer in eckigen Klammern verweist; excerpt trägt höchstens 300 Zeichen des Auszugs. Bei einer Antwort aus einem aktiven Frage-Antwort-Paar kommt genau ein Beleg: number 1, chunk_id aus qa: und der Kennung des Paares, die Frage des Paares als document und heading mit null; die Antwort selbst nennt diese Nummer nicht. |
follow_ups | questions, dropped, checked, reason | Vorgeschlagene Folgefragen nach einer fertigen Antwort, höchstens drei. Bei checked: true wurde jeder Vorschlag an Ihrem Wissen gemessen, und dropped zählt die verworfenen; bei checked: false nennt reason den Grund, etwa no_knowledge. |
contact_offer | offered | Der Assistent bietet eine Kontaktaufnahme an. |
handoff | handoff, reason | Das Gespräch geht an einen Menschen. reason ist etwa assistant, conversation_limit oder enforcement, wenn die Prüfung gegen die Grenzen des Assistenten übergibt. |
verification | state, claims, total | Ergebnis der Prüfung harter Angaben gegen die Belege, nach einer fertigen Antwort. state ist no_claims, verified, unverified, no_source (nichts lag vor, woran sich prüfen ließ) oder bei leerer Antwort skipped; claims nennt ungedeckte Stellen, total ihre Gesamtzahl. Nach einer Antwort aus einem Frage-Antwort-Paar entfällt das Ereignis, denn dort ist der Text die gepflegte Quelle selbst. |
redaction | text, reason, count, parts | Die Antwort wurde nachträglich berichtigt; text trägt den ganzen neuen Wortlaut. Bei reason: claims stehen an Stelle ungedeckter Angaben Platzhalter, [nicht belegt] bei deutscher oder unbestimmter Antwortsprache, sonst [not backed]; count nennt ihre Zahl. Hat eine Werkzeugkarte die Antwort unterbrochen, kommt parts hinzu: derselbe berichtigte Text in den Stücken zwischen den Karten, die zusammen genau text ergeben; lässt er sich so nicht teilen, fehlt parts. Bei reason: notice wurde der Pflichthinweis zu einer Grenze neu gesetzt, ohne count. |
enforcement | state, topics, handover | Ergebnis der Prüfung gegen die Grenzen des Assistenten, nach einer fertigen Antwort: state ist clear oder enforced, topics nennt berührte Themen, handover sagt, ob übergeben wird. |
tool | id, key, kind, state, preview, input, result, report, error, duration_ms, approval_path, needs_confirmation, chain_capped, created_at | Der Assistent hat ein Werkzeug aufgerufen. needs_confirmation ist true, wenn state den Wert proposed hat. |
model_switch | from, to, reason | Wechsel auf eine andere Stufe während der Antwort. |
fallback | reason, transient | Die Antwort ließ sich nicht erzeugen; transient sagt, ob der Fehler vorübergehend war. Danach folgt die Notfallantwort des Assistenten als text. |
error | code, limit | Sperre vor dem Aufruf, etwa conversation_limit, wenn die Höchstzahl an Fragen je Gespräch erreicht ist; limit nennt sie. Die Höchstzahl stellt der Betreiber im Bereich Betrieb für jedes Konto einzeln ein, siehe Mandanten und Grenzen. Danach folgen ein Hinweis als text, bei conversation_limit ein handoff und zum Schluss end mit state: blocked. |
live | live, since | Ein Mensch aus Ihrem Team hat das Gespräch übernommen; der Assistent antwortet nicht. Danach folgt end mit state: live. |
revoked | reason | Die Einwilligung wurde während der Antwort widerrufen; reason ist consent_revoked. Der bis dahin erzeugte Text wird verworfen und nicht gespeichert. |
end | siehe unten | Ende des Stroms. |
Feld in end | Inhalt |
|---|---|
state | done, aborted, fallback, blocked, revoked oder live. Bei live folgt nur noch message_id mit null. |
message_id | Kennung der gespeicherten Antwort; null, wenn keine gespeichert wurde |
verification_state, enforcement_state | Ergebnis der beiden Prüfungen mit den Werten aus verification und enforcement; skipped, wenn die Prüfung nicht lief, etwa nach einer Sperre oder einer Notfallantwort; verification_state ist skipped auch bei einer Antwort aus einem Frage-Antwort-Paar |
refused | true, wenn eine fertige Antwort eine Ablehnung war |
duration_ms, ttft_ms | Dauer der Antwort und Zeit bis zum ersten Textstück in Millisekunden |
tokens_in, tokens_out | verbrauchte Einheiten für Eingabe und Ausgabe; bei einer Antwort aus einem Frage-Antwort-Paar beide 0, denn dort wird kein Modell gefragt |
throttled, reply_limit | ob die Antwort wegen des Kontingents gedrosselt lief, und die Höchstlänge der Antwort in Einheiten |
citations | die Belege der Antwort |
Ausgelöste Webhooks
Die Wege dieser Schnittstelle lösen die folgenden Webhooks aus, sofern Sie für das Ereignis einen Empfänger eingerichtet haben, siehe Schlüssel und Webhooks. Die Ereignisse mit allen Auslösern, auch denen außerhalb der Integration, listet Ereignisse.
| Ereignis | Bezeichnung in der App | Auslöser | Nutzlast |
|---|---|---|---|
lead.created | Anfrage erstellt | POST /leads legt eine Anfrage neu an | id, conversation_id mit null, source |
knowledge.indexed | Wissensquelle aufgenommen | Text aufgenommen oder Website-Abruf gelungen | source_id, documents, chunks; beim Text zusätzlich reason mit null |
knowledge.failed | Wissensquelle fehlgeschlagen | Aufnahme gescheitert | source_id, reason; beim Text zusätzlich documents und chunks |
lead.created | Anfrage erstellt | POST /chat: der Assistent legt über ein Werkzeug eine Anfrage an | id, conversation_id |
appointment.requested | Termin angefragt | POST /chat: der Assistent legt über ein Werkzeug einen Termin an | id, conversation_id |
handoff.triggered | Übergabe ausgelöst | POST /chat: die Antwort übergibt ein noch nicht übergebenes Gespräch an einen Menschen | conversation_id, reason, queue (null, wenn keine Zuordnungsregel gegriffen hat) |
gap.detected | Wissenslücke erkannt | POST /chat: eine fertige Antwort verweist auf keinen Beleg, und der Assistent hat dabei kein Werkzeug aufgerufen, auch wenn die Suche Auszüge in Ihrem Wissen fand; Antworten aus einem Frage-Antwort-Paar, Antworten mit einem Werkzeugaufruf, auch einem nur vorgeschlagenen, Fragen unter 12 Zeichen und Konten ohne Wissen melden nichts | conversation_id, assistant_id, question (höchstens 300 Zeichen), kind (refused oder uncited) |
budget.exhausted | Budget erschöpft | POST /chat: der Verbrauch einer Antwort erreicht erstmals im Monat das Kontingent | month, budget, used |
Häufige Fragen
Warum antwortet die Schnittstelle mit 401, obwohl der Schlüssel stimmt?
Prüfen Sie, ob der Schlüssel im Kopf X-Api-Key steht und mit xbot_ beginnt. Ein zurückgezogener oder abgelaufener Schlüssel antwortet mit invalid_key, genau wie ein unbekannter. Steht der Schlüssel in der Adresse, kommt 400 mit key_in_url.
Wie verhindere ich doppelte Anfragen, wenn mein System erneut sendet?
Senden Sie bei POST /leads Ihre eigene Kennung in external_id. Eine Wiederholung mit derselben Kennung antwortet mit 200 und duplicate_prevented: true und liefert die vorhandene Anfrage.
Kann ich die Schnittstelle direkt aus dem Browser aufrufen?
Von einer fremden Domain aus nicht: die Integrationswege senden keine Freigabeköpfe für andere Ursprünge. Rufen Sie sie aus Ihrem Backend auf, wo auch der Schlüssel bleibt.
Wie setze ich ein Gespräch über die Schnittstelle fort?
Übernehmen Sie conversation_id aus dem Ereignis start der ersten Antwort und senden Sie sie mit der nächsten Frage an POST /chat. Fortsetzen lassen sich nur Gespräche desselben Assistenten aus dem Kanal api; läuft noch eine Antwort, kommt 409.
Wie erfahre ich, ob eine Website als Wissensquelle aufgenommen wurde?
POST /knowledge/sources mit url antwortet sofort mit 202 und dem Status new. Das Ergebnis des Abrufs melden die Webhooks knowledge.indexed oder knowledge.failed mit der Kennung der Quelle in source_id.
Selbst fragen, Assistent dieser Website
Automatischer Assistent