Zum Inhalt springen
XICBOT

Einstellungen

English
Dokumentation · Schnittstelle (API)

API-Schlüssel und Webhooks

API-Schlüssel mit Bereichen, Grenzen und Ablauf anlegen, Webhooks für zehn Ereignisse einrichten, Signaturen prüfen und Zustellungen nachverfolgen.

In einfacher Sprache

Auf dieser Seite der Anwendung legen Sie Schlüssel an. Mit einem Schlüssel rufen Ihre eigenen Systeme die Schnittstelle auf. Sie legen dort auch Webhooks an. Ein Webhook meldet Ereignisse an eine Adresse Ihres Systems. Die Seite erklärt, wer den Bereich sieht und nutzt. Sie zeigt, wie eine Meldung zugestellt und unterschrieben wird. Sie sagt auch, wann Daten gelöscht werden.

Stand

Alle Themen der Dokumentation

Unter Schnittstellen legen Sie API-Schlüssel an, mit denen eigene Systeme die Integrationsschnittstelle aufrufen, und Webhooks, über die XICBOT Ereignisse an eine Adresse Ihres Systems meldet. Die Seite liegt unter https://app.xicbot.de/schnittstellen, im Menü in der Gruppe Verwaltung. Grundbegriffe der Schnittstelle stehen unter API-Grundlagen.

Wer die Seite sieht und nutzt

Der Menüpunkt Schnittstellen erscheint ab der Rolle Verwaltung; die Rolle Inhaber schließt sie ein. Mit Lesen oder Bearbeiten fehlt der Punkt, und die Schnittstelle antwortet mit 403 und dem Kennzeichen role_too_low. Wer die Seite trotzdem aufruft, sieht nur „Das darf, wer mindestens die Rolle Verwaltung hat.“, ohne Formulare und Listen. Die Rollen beschreibt Team und Rollen.

Schlüssel und Webhooks gehören zu einer Funktion, die nur das Paket Individuell enthält. Fehlt sie, zeigt die Seite statt der Formulare den Satz „Der Tarif … enthält diese Funktion nicht. Die Übersicht steht unter Abrechnung.“ mit dem Namen Ihres Tarifs an Stelle der Auslassungspunkte und den Link Zur Abrechnung; ist kein Tarifname bekannt, lautet der Satz „Der gebuchte Tarif deckt das nicht ab. Die Übersicht steht unter Abrechnung.“ Schlüssel und Webhooks aus der Zeit vor einem Tarifwechsel stehen weiter darunter, und der Satz „Vorhandene Schlüssel und Webhooks bleiben hier sichtbar: Schlüssel lassen sich zurückziehen, Webhooks löschen. Solange der Tarif die Funktion nicht enthält, weist die Schnittstelle diese Schlüssel ab, und Webhooks erhalten keine Zustellungen.“ kommt hinzu. Zurückziehen, Zustellungen und Löschen bleiben, Probe senden, Abschalten und Einschalten fehlen. Über die Schnittstelle antworten Anlegen, Ändern und Probe mit 402 und plan_feature_missing, ebenso jeder Aufruf mit einem solchen Schlüssel; Liste, Zustellprotokoll, Zurückziehen und Löschen gehen auch ohne die Funktion. Enthält das Paket die Funktion wieder, arbeiten dieselben Schlüssel und Webhooks weiter; Ereignisse aus der Zwischenzeit werden nicht nachgeliefert. Welche Pakete die Funktion enthalten, zeigen Preise und Pakete und Kontingente.

  • Einen Schlüssel mit dem Bereich Gespräche lesen legt nur die Rolle Inhaber an, weil dieser Bereich die Nachrichten im Klartext liefert. Für andere Rollen ist das Kästchen gesperrt. Die Schnittstelle weist einen solchen Versuch mit 403, role_too_low und "required": "owner" ab, die App meldet „Das darf nur der Inhaber des Kontos.“
  • Schlüssel anlegen, Webhook anlegen und Probe senden zählen gemeinsam gegen eine Grenze von 10 Aufrufen pro Minute und angemeldeter Person. Darüber antwortet die Schnittstelle mit 429, die App zeigt „Zu viele Versuche. Bitte warten Sie einen Moment.“
  • Ist das Konto nicht aktiv, antworten die Aufrufe dieser Seite mit 403 und einem Kennzeichen der Form tenant_<status>; das Feld message lautet „Das Konto ist derzeit nicht aktiv.“ Die App zeigt „Dieses Konto ist gesperrt. Bitte schreiben Sie an mail@xicbot.de.“

API-Schlüssel

Ein API-Schlüssel beginnt mit xbot_, gefolgt von 48 zufälligen Zeichen. „Ein Schlüssel wird genau einmal im Klartext angezeigt. Gespeichert wird nur sein Abdruck.“ Neben dem SHA-256-Abdruck bleiben die ersten 12 Zeichen als Kennung stehen. Ein verlorener Schlüssel lässt sich darum nicht wiederherstellen, nur ersetzen.

Schlüssel anlegen

  1. Schritt 1

    Name vergeben

    Unter Name tragen Sie eine Bezeichnung ein, an der Sie den Schlüssel später erkennen, etwa das System, das ihn nutzt. Höchstens 80 Zeichen.

  2. Schritt 2

    Grenze und Ablauf festlegen

    Anfragen pro Minute begrenzt, wie oft dieser Schlüssel pro Minute aufrufen darf, vorbelegt mit 120. Läuft ab in Tagen setzt ein Ablaufdatum, gerechnet ab dem Anlegen; „Leer bedeutet ohne Ablauf.“

  3. Schritt 3

    Bereiche wählen

    Unter Bereiche kreuzen Sie mindestens einen Bereich an. Ohne Name oder ohne Bereich bleibt Neuen Schlüssel anlegen gesperrt.

  4. Schritt 4

    Schlüssel kopieren

    Es erscheint die Karte Ihr neuer Schlüssel mit dem Hinweis „Jetzt kopieren. Nach dem Schließen ist er nicht wieder abrufbar.“ Schlüssel kopieren legt ihn in die Zwischenablage, danach steht Schlüssel kopiert; ist die Zwischenablage nicht erreichbar, erscheint Die Zwischenablage ist hier nicht verfügbar. Markieren Sie den Wert und kopieren Sie ihn von Hand. Schließen nimmt ihn aus der Ansicht. Name, Bereiche und Ablauf werden geleert, die Grenze bleibt stehen.

FeldPflichtWerteVorgabe
Nameja1 bis 80 Zeichen–
Anfragen pro Minutein der App ja, über die Schnittstelle nein1 bis 6000120
Läuft ab in Tagennein1 bis 3650leer: ohne Ablauf
Bereicheja, mindestens einersiehe Bereiche–

Bereiche

Ein Schlüssel ruft nur die Routen auf, deren Bereich er trägt; „Schreiben ist ein eigener Bereich. Ohne ihn liest ein Schlüssel nur.“ GET /api/v1/integration/status braucht keinen Bereich. Welche Routen jeder Bereich öffnet und wie die Schnittstelle einen fehlenden Bereich ablehnt, steht unter API-Anmeldung.

Was die einzelnen Routen liefern, beschreibt API-Integration.

Die Schlüsselliste

Die Liste zeigt die Schlüssel des Kontos, neueste zuerst. Solange keiner angelegt ist, steht dort „Noch kein Schlüssel angelegt.“

SpalteInhalt
Namedie vergebene Bezeichnung
Kennungdie ersten 12 Zeichen, gefolgt von …, etwa xbot_Ab12Cd3…
Bereichedie Beschriftungen der Bereiche, durch Komma getrennt
Zuletzt benutztZeitpunkt der letzten Anfrage, auf etwa eine Minute genau; nie, solange der Schlüssel nicht benutzt wurde
Läuft abAblaufzeitpunkt oder ohne Frist
Statusgültig, abgelaufen oder zurückgezogen
AktionZurückziehen, solange der Schlüssel nicht zurückgezogen ist

Schlüssel zurückziehen

Zurückziehen fragt nach: „Schlüssel zurückziehen? Anfragen mit diesem Schlüssel werden danach abgewiesen.“ Erst ein zweites Zurückziehen wirkt, Abbrechen lässt den Schlüssel unverändert. Der Schlüssel bleibt danach mit dem Status zurückgezogen in der Liste und lässt sich nicht wieder gültig machen; Anfragen mit ihm erhalten 401 und invalid_key. Auch abgelaufene Schlüssel lassen sich zurückziehen.

Schlüssel verwenden

Den Schlüssel senden Sie im Kopf X-Api-Key an Routen unter /api/v1/integration. Ein Schlüssel in der Adresse, also ?api_key= oder ?key=, wird mit 400 und key_in_url abgewiesen. Einzelheiten zur Anmeldung stehen unter API-Anmeldung, zu den Grenzen unter API-Grenzen.

Befehl in der Schale bash

curl -s https://app.xicbot.de/api/v1/integration/status \
  -H "X-Api-Key: $XICBOT_API_KEY"

Wie die Schnittstelle einen Schlüssel der Reihe nach prüft und welche Antwort zu welcher Stufe gehört, steht unter API-Anmeldung, die Minuten- und Tagesdeckel unter Paketsperren und Drosseln.

Webhooks

Ein Webhook ist eine Zieladresse in Ihrem System, an die XICBOT bei gewählten Ereignissen eine signierte POST-Anfrage sendet. „Jede Sendung trägt eine Unterschrift im Kopf X-XICBOT-Signature. Fehlgeschlagene Sendungen werden wiederholt.“ Solange keiner eingerichtet ist, steht dort „Noch kein Webhook eingerichtet.“

Webhook anlegen

  1. Schritt 1

    Zieladresse eintragen

    Unter Zieladresse tragen Sie die Adresse Ihres Empfängers ein, etwa https://example.com/xicbot-webhook, höchstens 2048 Zeichen. Zugelassen sind http und https; wir empfehlen https. Welche Ziele abgewiesen werden, steht unter Zulässige Zieladressen.

  2. Schritt 2

    Ereignisse wählen

    Unter Ereignisse kreuzen Sie mindestens eines der zehn Ereignisse an. Ohne Adresse oder ohne Ereignis bleibt Webhook anlegen gesperrt.

  3. Schritt 3

    Geheimnis sichern

    Es erscheint die Karte Ihr Signaturgeheimnis mit dem Satz „Damit prüfen Sie die Unterschrift der eingehenden Sendung.“ Das Geheimnis beginnt mit whsec_, gefolgt von 48 Zeichen. Geheimnis kopieren legt es in die Zwischenablage, Schließen nimmt es aus der Ansicht.

Ereignisse

Neben der Beschriftung in der App steht der technische Name, der im Feld event und im Kopf X-XICBOT-Event ankommt. Welche Felder data trägt, hängt vom Ereignis ab; Kennungen kommen als Zeichenkette.

EreignisBeschriftungWannFelder in data
conversation.startedGespräch begonnenDas Widget eröffnet ein neues Gespräch.conversation_id, assistant_id, channel
conversation.endedGespräch beendetEin Gespräch wird in der App abgeschlossen, ab Rolle Bearbeiten.conversation_id, assistant_id
handoff.triggeredÜbergabe ausgelöstEin Gespräch wird an Ihr Team übergeben.conversation_id, reason (maskiert wie in der App, bis 300 Zeichen), queue (aus der zutreffenden Regel, sonst null)
lead.createdAnfrage erstelltDer Assistent legt im Gespräch erstmals eine Anfrage an, oder eine Anfrage kommt über POST /api/v1/integration/leads.id, conversation_id (über die Schnittstelle null); über die Schnittstelle zusätzlich source
appointment.requestedTermin angefragtDer Assistent nimmt im Gespräch erstmals einen Terminwunsch auf.id, conversation_id
appointment.confirmedTermin bestätigtEin Termin wird in der App auf bestätigt gesetzt, ab Rolle Bearbeiten.id, starts_at
knowledge.indexedWissensquelle aufgenommenEine im Hintergrund verarbeitete Quelle, etwa eine Website, ist aufgenommen oder aufgefrischt, oder eine Quelle aus POST /api/v1/integration/knowledge/sources ist fertig.source_id, documents, chunks; über die Schnittstelle zusätzlich reason mit null
knowledge.failedWissensquelle fehlgeschlagenDieselben Fälle, wenn die Aufnahme scheitert.source_id, reason; über die Schnittstelle zusätzlich documents, chunks
gap.detectedWissenslücke erkanntEine fertige Antwort des Assistenten nennt keine Belegstelle aus Ihrem Wissen, auch wenn die Suche etwas gefunden hat: Er lehnt ab (refused) oder antwortet ohne Beleg (uncited). Eine Antwort, für die der Assistent ein Werkzeug aufgerufen hat, zählt nicht. Die Frage hat mindestens 12 Zeichen, und im Konto ist bereits Wissen vorhanden.conversation_id, assistant_id, question (maskiert wie in der Auswertung, bis 300 Zeichen), kind (refused oder uncited)
budget.exhaustedBudget erschöpftEine Buchung hebt den Verbrauch des laufenden Monats auf oder über das Monatskontingent des Kontos. Gemeldet wird dieser Übergang, nicht der Zustand; ohne gesetztes Kontingent entfällt das Ereignis.month, budget, used

Eine erneut erfasste, gleiche Anfrage oder Terminanfrage löst kein zweites Ereignis aus. Besuchertext in question und reason geht maskiert hinaus: E-Mail-Adressen, Rufnummern, Kontonummern und Anschriften stehen als Platzhalter wie [E-Mail]; maskiert wird vor dem Kürzen. Den Klartext eines Gesprächs gibt nur ein Schlüssel mit dem Bereich conversations heraus, und den legt nur der Inhaber an. Zusätzlich gibt es das Ereignis probe; es entsteht nur über Probe senden, lässt sich nicht abonnieren und trägt in data das Feld note. Zu Gesprächen, Übergaben und Wissen siehe Gespräche, Termine und Vorgänge und Wissensaufbau und Antworten.

Probe und Zustellungen

Jede Webhook-Karte zeigt die Zieladresse, die abonnierten Ereignisse und den Zustand gültig oder abgeschaltet, dahinter Fehler in Folge mit Stand und Grenze, etwa 0 / 20.

  • Probe senden stellt sofort eine Sendung mit dem Ereignis probe zu, ohne Wiederholung und auch an einen abgeschalteten Webhook. Darunter erscheint Probe zugestellt mit dem Statuscode Ihres Empfängers oder Probe fehlgeschlagen mit dem Text aus den Zustellgründen, ersatzweise mit dem Statuscode oder der Fehlermeldung der Verbindung. Danach zeigt die Seite die Zustellungen dieses Webhooks. Eine Probe zählt wie jede Zustellung in Fehler in Folge.
  • Zustellungen klappt die letzten 50 Zustellungen dieses Webhooks auf, neueste zuerst, mit den Spalten Zeit, Ereignisse, Versuch, Status und Dauer. Unter Status steht bei Erfolg der Statuscode, bei einem Fehlschlag der Text aus den Zustellgründen, ersatzweise der Statuscode oder die Fehlermeldung der Verbindung. Dauer ist in Millisekunden angegeben. Ohne Eintrag steht dort „Noch keine Zustellung.“
  • Gespeichert wird je Zustellung ein SHA-256-Abdruck des gesendeten Körpers, nicht der Inhalt. Wiederholungen eines Ereignisses erscheinen als eigene Zeilen mit steigendem Versuch.

Abschalten, einschalten, löschen

Der dritte Knopf der Karte schaltet um: Bei einem laufenden Webhook heißt er Abschalten, bei einem abgeschalteten Einschalten. Ein abgeschalteter Webhook erhält keine Ereignisse, und bereits geplante Wiederholungen entfallen. Beim Einschalten beginnt Fehler in Folge wieder bei 0.

Löschen fragt zuerst nach: Diesen Webhook löschen? Zustellungen an diese Adresse enden sofort, und das Signaturgeheimnis lässt sich nicht wiederherstellen. Darunter steht die Zieladresse, dazu die Knöpfe Abbrechen und Löschen. Erst die Bestätigung entfernt den Webhook samt seinem Zustellprotokoll; ausstehende Zustellungen entfallen. Adresse und Geheimnis lassen sich nicht ändern. Die abonnierten Ereignisse ändern Sie über PUT /api/v1/webhooks/{id}, in der App nicht.

Zustellung und Signatur

Aufbau einer Sendung

Jede Sendung ist ein POST mit einem JSON-Körper aus vier Feldern: event, at (Zeitpunkt des Ereignisses nach ISO 8601, für alle Versuche gleich), tenant (Kennung Ihres Kontos) und data. Umlaute und Schrägstriche stehen unmaskiert im Text.

Quelltext json

{
  "event": "lead.created",
  "at": "2026-09-28T10:15:00+00:00",
  "tenant": "<Kontokennung>",
  "data": {
    "id": "<Anfragekennung>",
    "conversation_id": "<Gesprächskennung>"
  }
}
KopfInhalt
Content-Typeapplication/json
X-XICBOT-Eventtechnischer Name des Ereignisses
X-XICBOT-Deliveryeine UUID je Ereignis und Webhook, für alle Versuche gleich
X-XICBOT-AttemptNummer des Versuchs, beginnend bei 1
X-XICBOT-Signaturet=<Unix-Zeit>,v1=<HMAC-SHA256 als Hex>
User-AgentXICBOT-Webhook/1

Signatur prüfen

Die Signatur ist ein HMAC-SHA256 über den Zeitstempel t, einen Punkt und den unveränderten Anfragekörper. Als Schlüssel dient das ganze Geheimnis einschließlich whsec_. Prüfen Sie den Rohkörper, wie er ankommt, nicht ein daraus neu erzeugtes JSON: eine andere Feldreihenfolge oder maskierte Umlaute ergeben eine andere Signatur.

  • Den Kopf X-XICBOT-Signature an den Kommas trennen und t und v1 lesen.
  • t, einen Punkt und den Rohkörper mit dem Geheimnis per HMAC-SHA256 verrechnen und als Hex schreiben.
  • Das Ergebnis mit v1 in gleichbleibender Zeit vergleichen, nicht mit einem einfachen Gleichheitsvergleich.
  • Das Alter der Sendung über t begrenzen, etwa auf fünf Minuten, damit eine mitgeschnittene Sendung nicht später erneut eingespielt werden kann.
  • Innerhalb von 8 Sekunden mit einem Status von 200 bis 299 antworten und aufwendige Arbeit danach erledigen.

verify-signature.mjs javascript

import { createHmac, timingSafeEqual } from 'node:crypto';

// Prüft X-XICBOT-Signature gegen den Rohkörper (Buffer oder String).
export function verifySignature(rawBody, header, secret, toleranceSec = 300) {
  const parts = Object.fromEntries(
    String(header ?? '').split(',').map((part) => part.split('=', 2)),
  );
  const t = Number(parts.t);
  if (!Number.isInteger(t) || Math.abs(Date.now() / 1000 - t) > toleranceSec) {
    return false; // fehlt oder zu alt
  }
  const expected = createHmac('sha256', secret).update(`${t}.`).update(rawBody).digest('hex');
  const given = Buffer.from(String(parts.v1 ?? ''), 'hex');
  const wanted = Buffer.from(expected, 'hex');
  return given.length === wanted.length && timingSafeEqual(given, wanted);
}

webhook.php php

<?php
// Rohkörper lesen, nicht $_POST und kein neu erzeugtes JSON
$body = file_get_contents('php://input');
$header = $_SERVER['HTTP_X_XICBOT_SIGNATURE'] ?? '';
parse_str(str_replace(',', '&', $header), $parts);
$t = (int) ($parts['t'] ?? 0);
$expected = hash_hmac('sha256', $t . '.' . $body, getenv('XICBOT_WEBHOOK_SECRET'));
$fresh = abs(time() - $t) <= 300;
if (!$fresh || !hash_equals($expected, (string) ($parts['v1'] ?? ''))) {
    http_response_code(400);
    exit;
}
http_response_code(204);
$event = json_decode($body, true);

Zur Kontrolle: der SHA-256-Abdruck des Rohkörpers entspricht dem Feld content_hash der Zustellung in GET /api/v1/webhooks/{id}/deliveries.

Wiederholung

Ereignisse werden im Hintergrund zugestellt. Als Erfolg gilt eine Antwort mit Status 200 bis 299 innerhalb von 8 Sekunden. Umleitungen mit Status 300 bis 399 werden nicht verfolgt und gelten als Fehlschlag. Nach einem Fehlschlag folgt ein zweiter Versuch nach etwa 30 Sekunden und ein dritter nach etwa 120 Sekunden; scheitert auch er, wird das Ereignis nicht weiter zugestellt. Die Verarbeitung im Hintergrund beschreibt Hintergrundaufträge.

  • Jeder Versuch wird neu signiert: t ändert sich, X-XICBOT-Attempt zählt hoch. at und X-XICBOT-Delivery bleiben für alle Versuche eines Ereignisses gleich; eine Wiederholung erkennen Sie darum an X-XICBOT-Delivery. Eine Probe erhält bei jedem Senden eine neue Kennung.
  • Ist der Webhook beim Versuch abgeschaltet oder gelöscht oder enthält das Paket die Funktion nicht mehr, entfällt die Zustellung ohne weiteren Versuch und ohne Eintrag im Zustellprotokoll.
  • Scheitert die Prüfung der Zieladresse erst beim Versand, etwa weil der Name inzwischen auf eine interne Adresse zeigt, wird der Versuch protokolliert, wiederholt und in Fehler in Folge gezählt wie bei einem Empfänger, der nicht antwortet. Lässt sich das Signaturgeheimnis nicht lesen, wird der Versuch protokolliert und wiederholt, zählt aber nicht in Fehler in Folge.

Zulässige Zieladressen

Die Adresse wird beim Anlegen und vor jedem Versand geprüft. Zugelassen sind http und https. Der Name muss sich auflösen lassen und auf eine öffentliche Adresse zeigen; private und reservierte Bereiche wie 10.0.0.0/8 oder 192.168.0.0/16 werden abgewiesen. Zeigt der Name auf mehrere Adressen, muss jede öffentlich sein; verbunden wird nur mit den geprüften Adressen. Beim Anlegen meldet die App „Diese Adresse ist als Ziel nicht zugelassen.“, die Schnittstelle antwortet mit 422 und einem der Gründe url_unreadable, scheme_not_allowed, name_unresolvable oder target_not_allowed im Feld error.

Gründe fehlgeschlagener Zustellungen

Diese Kennzeichen stehen im Feld reason der Probe und im Feld error des Zustellprotokolls. Die App zeigt dazu folgende Texte:

KennzeichenAnzeige in der App
redirect_not_followed„Das Ziel hat umgeleitet. Umleitungen werden nicht verfolgt – bitte die endgültige Adresse eintragen.“
secret_unreadable„Das Signaturgeheimnis ließ sich nicht lesen.“
url_unreadable„Die Adresse ist nicht lesbar.“
scheme_not_allowed„Diese Adressart wird nicht unterstützt.“
name_unresolvable„Der Name der Adresse lässt sich nicht auflösen.“
target_not_allowed„Dieses Ziel ist nicht erlaubt, etwa eine interne Adresse.“
http_<Status>der Statuscode Ihres Empfängers, etwa 500
anderer Textdie Fehlermeldung der Verbindung, gekürzt auf 240 Zeichen, etwa bei Zeitüberschreitung

Verwaltung über die Schnittstelle

Dieselben Vorgänge stehen unter /api/v1 bereit. Angemeldet wird mit der Sitzungsmarke einer Person mit mindestens der Rolle Verwaltung, nicht mit einem API-Schlüssel: ein API-Schlüssel verwaltet weder Schlüssel noch Webhooks. Wie Sie eine Sitzungsmarke erhalten, steht unter API-Anmeldung. Fehler kommen als JSON, in der Regel mit einem Kennzeichen im Feld error; Feldfehler stehen im Feld errors.

Routen für Schlüssel

GET /api/v1/keys

Liefert die Schlüssel des Kontos, neueste zuerst, in keys, dazu die erlaubten Bereiche in scopes und die Höchstzahl gültiger Schlüssel in limit_active.

Anmeldung
Sitzungsmarke, Rolle Verwaltung oder Inhaber

POST /api/v1/keys

Legt einen Schlüssel an. Felder: name (Pflicht, bis 80 Zeichen), scopes (Pflicht, mindestens ein Bereich), limit_per_min (1 bis 6000, ohne Angabe 120), expires_in_days (1 bis 3650, ohne Angabe kein Ablauf). Antwort 201 mit key und dem Klartext in plaintext_once.

Anmeldung
Sitzungsmarke, Rolle Verwaltung oder Inhaber; mit Bereich conversations nur Inhaber
Begrenzung
10 Aufrufe pro Minute und Person, gemeinsam mit den anderen Anlage- und Probeaufrufen

DELETE /api/v1/keys/{id}

Zieht den Schlüssel zurück. Er bleibt mit dem Zeitpunkt in withdrawn erhalten und lässt sich nicht wieder gültig machen; ein zweiter Aufruf ändert nichts. Antwort 200 mit key.

Anmeldung
Sitzungsmarke, Rolle Verwaltung oder Inhaber

Befehl in der Schale bash

curl -s https://app.xicbot.de/api/v1/keys \
  -H "Authorization: Bearer <Marke>" \
  -H "Content-Type: application/json" \
  -d '{"name": "Warenwirtschaft", "scopes": ["leads", "leads.write"], "limit_per_min": 60, "expires_in_days": 365}'
Feld im Objekt keyInhalt
idKennung des Schlüssels
nameBezeichnung
prefixdie ersten 12 Zeichen
scopesListe der Bereiche
limit_per_minAnfragen pro Minute
last_used_atletzte Nutzung nach ISO 8601, sonst null
expires_atAblauf nach ISO 8601, sonst null
withdrawnZeitpunkt des Zurückziehens, sonst null
validtrue, solange weder zurückgezogen noch abgelaufen

Routen für Webhooks

GET /api/v1/webhooks

Liefert die Webhooks des Kontos, neueste zuerst, in webhooks, dazu die abonnierbaren Ereignisse in events und die Abschaltgrenze in failure_limit.

Anmeldung
Sitzungsmarke, Rolle Verwaltung oder Inhaber

POST /api/v1/webhooks

Legt einen Webhook an. Felder: url (Pflicht, bis 2048 Zeichen, gültige Adresse) und events (Pflicht, mindestens ein Ereignis). Antwort 201 mit webhook und dem Geheimnis in secret_once. Eine nicht zugelassene Adresse ergibt 422 mit dem Grund in error.

Anmeldung
Sitzungsmarke, Rolle Verwaltung oder Inhaber
Begrenzung
10 Aufrufe pro Minute und Person, gemeinsam mit den anderen Anlage- und Probeaufrufen

PUT /api/v1/webhooks/{id}

Ändert events (mindestens ein Ereignis) und is_active. Mit is_active: true beginnt der Fehlerzähler bei 0, und disabled_at wird geleert. Adresse und Geheimnis lassen sich hier nicht ändern.

Anmeldung
Sitzungsmarke, Rolle Verwaltung oder Inhaber

DELETE /api/v1/webhooks/{id}

Löscht den Webhook samt Zustellprotokoll. Antwort {"deleted": true}.

Anmeldung
Sitzungsmarke, Rolle Verwaltung oder Inhaber

POST /api/v1/webhooks/{id}/test

Sendet sofort eine Probe mit dem Ereignis probe, auch an einen abgeschalteten Webhook und ohne Wiederholung. Antwort test mit delivered und reason; status und duration_ms kommen hinzu, wenn tatsächlich gesendet wurde.

Anmeldung
Sitzungsmarke, Rolle Verwaltung oder Inhaber
Begrenzung
10 Aufrufe pro Minute und Person, gemeinsam mit den anderen Anlage- und Probeaufrufen

GET /api/v1/webhooks/{id}/deliveries

Liefert die letzten 50 Zustellungen, neueste zuerst, mit event, content_hash (SHA-256 des gesendeten Körpers), attempt, status, duration_ms, error und at.

Anmeldung
Sitzungsmarke, Rolle Verwaltung oder Inhaber
Feld im Objekt webhookInhalt
idKennung des Webhooks
urlZieladresse
eventsabonnierte Ereignisse
is_activetrue, solange eingeschaltet
failures_in_rowFehlschläge in Folge
disabled_atZeitpunkt der automatischen Abschaltung, sonst null
secret_hashdie ersten 12 Zeichen des SHA-256-Abdrucks des Geheimnisses

Fehlerantworten

StatusKennzeichenBedeutung
402plan_feature_missingDie Funktion fehlt im Paket; dazu feature, plan, plan_name und available_in. Gilt für Anlegen, Ändern und Probe, nicht für Liste, Zustellprotokoll, Zurückziehen und Löschen.
403role_too_lowRolle zu niedrig; required nennt admin oder beim Bereich conversations owner.
403no_tenant, tenant_<status>Kein Konto zugeordnet oder Konto nicht aktiv.
404not_foundSchlüssel oder Webhook ist in diesem Konto nicht vorhanden, etwa weil der Webhook inzwischen gelöscht wurde. Die App zeigt „Diesen Eintrag gibt es nicht mehr. Laden Sie die Seite neu, um den aktuellen Stand zu sehen.“
422too_many_keys10 gültige Schlüssel sind erreicht; limit nennt die Grenze.
422url_unreadable, scheme_not_allowed, name_unresolvable, target_not_allowedDie Zieladresse ist nicht zugelassen.
422FeldfehlerPflichtfeld fehlt oder Wert liegt außerhalb der Grenzen; die Einzelheiten stehen im Feld errors. Die App zeigt „Das hat nicht geklappt. Bitte prüfen Sie Ihre Eingaben.“
429–Mehr als 10 Anlage- oder Probeaufrufe pro Minute.

Aufbewahrung und Löschung

  • Das Zustellprotokoll wird nach der Frist für Protokolle gelöscht, die für Ihr Konto gilt; steht sie auf 0, entfällt dieses Löschen. Mit einem Webhook geht auch sein Protokoll.
  • Zurückgezogene und abgelaufene Schlüssel bleiben in der Liste stehen; ein Löschen einzelner Schlüssel gibt es nicht.
  • Der Datenexport des Kontos enthält Schlüssel, Webhooks und Zustellprotokoll, jedoch ohne Schlüsselabdruck und ohne Signaturgeheimnis.
  • Beim Löschen des Kontos werden Schlüssel, Webhooks und Zustellprotokoll gelöscht.

Fristen und Export beschreibt Aufbewahrung und Löschung, den Schutz von Zugangsdaten Datensicherheit.

Häufige Fragen

Ich habe den Schlüssel nicht kopiert. Lässt er sich noch einmal anzeigen?

Nein. Gespeichert ist nur sein Abdruck. Legen Sie einen neuen Schlüssel an, stellen Sie Ihr System um und ziehen Sie den alten mit Zurückziehen zurück.

Wie ändere ich die Zieladresse eines Webhooks?

Die Adresse lässt sich nicht ändern. Legen Sie einen Webhook mit der neuen Adresse an, hinterlegen Sie das neue Geheimnis in Ihrem Empfänger und löschen Sie danach den alten Webhook. Die Ereignisse eines Webhooks ändern Sie über PUT /api/v1/webhooks/{id}.

Warum steht mein Webhook auf abgeschaltet?

Entweder wurde er von Hand abgeschaltet, oder 20 Versuche in Folge sind gescheitert; dann ist disabled_at gesetzt. Sehen Sie unter Zustellungen den Grund nach, beheben Sie ihn, prüfen Sie mit Probe senden und schalten Sie ihn mit Einschalten wieder ein.

Warum ist das Kästchen Gespräche lesen gesperrt?

Dieser Bereich liefert Nachrichten im Klartext. Einen Schlüssel damit legt nur die Rolle Inhaber an; mit der Rolle Verwaltung bitten Sie den Inhaber darum.

Kann ein Ereignis mehrfach ankommen?

Ja, wenn Ihr Empfänger die Sendung verarbeitet, aber nicht innerhalb von 8 Sekunden mit 200 bis 299 antwortet: dann folgt ein weiterer Versuch. Alle Versuche tragen dieselbe Kennung in X-XICBOT-Delivery; werten Sie sie aus und verarbeiten Sie dasselbe Ereignis nur einmal.

Eine Stelle ist unklar geblieben?

Schreiben Sie uns, welche Seite und welcher Schritt gemeint ist. Wir antworten persönlich.

Anfrage in drei Schritten

  1. 1. Anliegen
  2. 2. Ihr Fall
  3. 3. Kontakt

Worum geht es?

Ein Klick genügt, alles Weitere ist freiwillig.

Erzählen Sie kurz von Ihrem Fall

Alle Angaben in diesem Schritt sind freiwillig. Sie helfen uns, gleich mit etwas Konkretem zu antworten statt mit Rückfragen.

Anfragen im Monat, ungefähr (optional)
Wann soll es losgehen? (optional)
Wie erreichen wir Sie?

Name und E-Mail-Adresse genügen. Wir antworten persönlich.

Wir verwenden Ihre Angaben, um Ihre Anfrage zu bearbeiten. Mehr dazu in der Datenschutzerklärung.