Der Verkaufsagent antwortet im Widget der eigenen WebsiteAlle Beiträge

Der Verkaufsagent antwortet im Widget der eigenen Website

Anfragen kommen nachts und am Wochenende. Dieser Fall zeigt, wie ein Widget sie beantwortet, ohne dass ein Browserskript je Ihren API-Schlüssel sieht.

Veröffentlicht: 2026-09-12Lesezeit: 4 mintapinomahub API & Prozesse
API & ProzesseAPIAutomotive AftermarketMarktplätzeTeilehandelFahrzeughandelLogistik & Lager

Viele Anfragen zu einem Gebrauchtteil sind dieselben drei Fragen: Passt es an mein Fahrzeug, was kostet der Versand, in welchem Zustand ist es. Sie kommen abends und am Wochenende, und wer bis Montag wartet, kauft woanders. Ein Formular nimmt die Frage auf, beantwortet sie aber nicht.

Der Verkaufsagent antwortet im Widget der eigenen WebsiteEingang: ein Besucher öffnet das Widget; es weist sich mit einem Kanalschlüssel aus, nicht mit Ihrem API-Schlüssel 1. Widget einrichten (GET /web/channel): title, greeting, accentColor, locale und maxMessageChars für die Oberfläche 2. Gespräch beginnen (POST /web/conversations): conversationId und gleich die erste Antwort, dazu needsHuman und owner 3. Weiter antworten (POST /web/conversations/{conversationId}/messages): Je Zug eine Antwort mit seq; dieselbe clientMessageId liefert die gespeicherte Antwort 4. Gespräch schliessen (POST /web/conversations/{conversationId}/close): Ein beendetes Gespräch, das im Posteingang nachvollziehbar bleibt Ausgang: beantwortete Anfragen rund um die Uhr, mit einer Übergabe an den Menschen, wo es angebracht ist needsHuman ist kein Fehler, sondern die eingebaute Grenze des Agenten. Wer sie ignoriert, verkauft Vertrauen.Der Verkaufsagent antwortet im Widget der eigenen WebsiteEingang: ein Besucher öffnet das Widget; es weist sich mit einem Kanalschlüssel aus, nicht mitIhrem API-Schlüssel01Widget einrichtenGET /web/channeltitle, greeting, accentColor, locale und maxMessageChars für die Oberfläche02Gespräch beginnenPOST /web/conversationsconversationId und gleich die erste Antwort, dazu needsHuman und owner03Weiter antwortenPOST /web/conversations/{conversationId}/messagesJe Zug eine Antwort mit seq; dieselbe clientMessageId liefert die gespeicherte Antwort04Gespräch schliessenPOST /web/conversations/{conversationId}/closeEin beendetes Gespräch, das im Posteingang nachvollziehbar bleibtAusgang: beantwortete Anfragen rund um die Uhr, mit einer Übergabe an den Menschen, wo esangebracht istneedsHuman ist kein Fehler, sondern die eingebaute Grenze des Agenten. Wer sie ignoriert, verkauft Vertrauen.
Vier Aufrufe des Browser-Gateways. needsHuman und owner sagen in jeder Antwort, wer zuständig ist.

Der Website-Kanal ist als Browser-Gateway gebaut, nicht als Hub-Aufruf mit versteckter Zugangskennung: Das Widget weist sich mit einem Kanalschlüssel aus, der sich jederzeit wechseln lässt. Ihr API-Schlüssel bleibt auf dem Server, wo er hingehört.

FlächeRollen
VerkaufsagentTeilehandel, Fahrzeughandel, Plattform und Marktplatz

Was dieser Fall voraussetzt

  • Ein eingerichtetes Profil. Der Agent antwortet nach seiner Anweisung; ohne Profil gibt es keinen Ton, keine Regeln und keine Befugnisse.
  • Ein Website-Kanal mit erlaubten Ursprüngen. allowedOrigins legt fest, von welchen Adressen das Widget sprechen darf — das ist der Schutz gegen Fremdnutzung des Kanalschlüssels. Beim Einrichten des Widgets und beim Beginn eines Gesprächs muss der Origin der Anfrage einer dieser Ursprünge sein, sonst antwortet das Gateway mit origin_not_allowed.
  • Das Besuchertoken. GET /web/channel gibt es aus; das Gateway erwartet es in der Kopfzeile X-Agent-Visitor zurück.
  • Eine Stelle, an der Übergaben landen. needsHuman ohne Posteingang ist eine Warnung, die niemand liest.

Der Ablauf

Die Tabelle nennt je Stufe den zuständigen Aufruf und das, was danach vorliegt. Die Begründung, warum die Stufe nicht übersprungen werden kann, steht darunter.

Die Aufrufkette dieses Anwendungsfalls
StufeAufrufWas danach vorliegt
Widget einrichtenGET /web/channeltitle, greeting, accentColor, locale und maxMessageChars für die Oberfläche
Gespräch beginnenPOST /web/conversationsconversationId und gleich die erste Antwort, dazu needsHuman und owner
Weiter antwortenPOST /web/conversations/{conversationId}/messagesJe Zug eine Antwort mit seq; dieselbe clientMessageId liefert die gespeicherte Antwort
Gespräch schliessenPOST /web/conversations/{conversationId}/closeEin beendetes Gespräch, das im Posteingang nachvollziehbar bleibt

Warum jede Stufe nötig ist

  1. Das Widget einrichten. GET /web/channel liefert title, greeting, accentColor, locale, pollIntervalSeconds und maxMessageChars. Die Oberfläche wird also nicht im Skript hart verdrahtet, sondern aus dem Kanal geladen — eine Änderung am Begrüßungstext braucht keinen neuen Seitenaufbau.
  2. Das Gespräch beginnen. POST /web/conversations nimmt die erste Nachricht an und führt gleich den ersten Zug aus. Zurück kommen conversationId, seq und die Antwort, dazu needsHuman und owner. Ein zweiter Aufruf für die erste Antwort wäre eine vermeidbare Wartezeit.
  3. Weiter antworten. POST /web/conversations/{conversationId}/messages führt jeden weiteren Zug aus. Die clientMessageId ist dabei wichtiger, als sie aussieht: Wird eine Nachricht mit derselben clientMessageId erneut abgeschickt, liefert der Aufruf die gespeicherte Antwort, statt noch einmal zu laufen.
  4. Das Gespräch schliessen. POST /web/conversations/{conversationId}/close beendet es. Geschlossen heißt nicht gelöscht — der Verlauf bleibt im Posteingang nachvollziehbar, und genau das braucht man bei einer Beschwerde.
Ein Gespräch aus dem Widget beginnen
curl -X POST \
  -H 'X-Agent-Channel-Key: <KANALSCHLUESSEL>' \
  -H 'X-Agent-Visitor: <BESUCHERTOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{"message":"Passt der Scheinwerfer an einen Golf 7 Facelift?","clientMessageId":"m-1"}' \
  'https://api.tapinomahub.com/agent/api/index.php/web/conversations'

Was am Ende vorliegt

Am Ende beantwortet die Website die wiederkehrenden Fragen selbst und gibt die übrigen mit Verlauf an einen Kollegen weiter. Der Besucher wartet nicht bis Montag, und der Kollege beginnt nicht bei null.

Wo das in der Dokumentation steht

Die verbindlichen Feldlisten, Fehlercodes und Beispielantworten stehen im OpenAPI-Vertrag dieser Fläche unter docs.tapinomahub.com (tapinoma-agent). Alle Anwendungsfälle nach Fläche und Rolle geordnet: Übersicht der Anwendungsfälle.

Quellen und Rechtsgrundlagen

Häufige Fragen

Kommt mein API-Schlüssel in den Browser?

Nein. Das Widget weist sich mit einem Kanalschlüssel aus, der nur für diesen Kanal gilt und sich wechseln lässt. Der API-Schlüssel bleibt serverseitig.

Was passiert, wenn ein Fremder den Kanalschlüssel kopiert?

Dafür gibt es die erlaubten Ursprünge und die Möglichkeit, den Kanalschlüssel zu wechseln. Zusätzlich lassen sich Züge je Besucher und Gespräche je Stunde begrenzen.

Kann ich die Begrüßung ändern, ohne die Seite neu zu bauen?

Ja. Das Widget lädt Titel, Begrüßung und Akzentfarbe aus dem Kanal. Eine Änderung am Kanal wirkt beim nächsten Laden.