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.
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_lowund"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
403und einem Kennzeichen der Formtenant_<status>; das Feldmessagelautet „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
-
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.
-
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.“
-
Schritt 3
Bereiche wählen
Unter Bereiche kreuzen Sie mindestens einen Bereich an. Ohne Name oder ohne Bereich bleibt Neuen Schlüssel anlegen gesperrt.
-
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.
| Feld | Pflicht | Werte | Vorgabe |
|---|---|---|---|
| Name | ja | 1 bis 80 Zeichen | – |
| Anfragen pro Minute | in der App ja, über die Schnittstelle nein | 1 bis 6000 | 120 |
| Läuft ab in Tagen | nein | 1 bis 3650 | leer: ohne Ablauf |
| Bereiche | ja, mindestens einer | siehe 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.“
| Spalte | Inhalt |
|---|---|
| Name | die vergebene Bezeichnung |
| Kennung | die ersten 12 Zeichen, gefolgt von …, etwa xbot_Ab12Cd3… |
| Bereiche | die Beschriftungen der Bereiche, durch Komma getrennt |
| Zuletzt benutzt | Zeitpunkt der letzten Anfrage, auf etwa eine Minute genau; nie, solange der Schlüssel nicht benutzt wurde |
| Läuft ab | Ablaufzeitpunkt oder ohne Frist |
| Status | gültig, abgelaufen oder zurückgezogen |
| Aktion | Zurü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
-
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 sindhttpundhttps; wir empfehlenhttps. Welche Ziele abgewiesen werden, steht unter Zulässige Zieladressen. -
Schritt 2
Ereignisse wählen
Unter Ereignisse kreuzen Sie mindestens eines der zehn Ereignisse an. Ohne Adresse oder ohne Ereignis bleibt Webhook anlegen gesperrt.
-
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.
| Ereignis | Beschriftung | Wann | Felder in data |
|---|---|---|---|
conversation.started | Gespräch begonnen | Das Widget eröffnet ein neues Gespräch. | conversation_id, assistant_id, channel |
conversation.ended | Gespräch beendet | Ein Gespräch wird in der App abgeschlossen, ab Rolle Bearbeiten. | conversation_id, assistant_id |
handoff.triggered | Übergabe ausgelöst | Ein 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.created | Anfrage erstellt | Der 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.requested | Termin angefragt | Der Assistent nimmt im Gespräch erstmals einen Terminwunsch auf. | id, conversation_id |
appointment.confirmed | Termin bestätigt | Ein Termin wird in der App auf bestätigt gesetzt, ab Rolle Bearbeiten. | id, starts_at |
knowledge.indexed | Wissensquelle aufgenommen | Eine 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.failed | Wissensquelle fehlgeschlagen | Dieselben Fälle, wenn die Aufnahme scheitert. | source_id, reason; über die Schnittstelle zusätzlich documents, chunks |
gap.detected | Wissenslücke erkannt | Eine 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.exhausted | Budget erschöpft | Eine 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
probezu, 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>"
}
}| Kopf | Inhalt |
|---|---|
Content-Type | application/json |
X-XICBOT-Event | technischer Name des Ereignisses |
X-XICBOT-Delivery | eine UUID je Ereignis und Webhook, für alle Versuche gleich |
X-XICBOT-Attempt | Nummer des Versuchs, beginnend bei 1 |
X-XICBOT-Signature | t=<Unix-Zeit>,v1=<HMAC-SHA256 als Hex> |
User-Agent | XICBOT-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-Signaturean den Kommas trennen undtundv1lesen. t, einen Punkt und den Rohkörper mit dem Geheimnis per HMAC-SHA256 verrechnen und als Hex schreiben.- Das Ergebnis mit
v1in gleichbleibender Zeit vergleichen, nicht mit einem einfachen Gleichheitsvergleich. - Das Alter der Sendung über
tbegrenzen, 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-Attemptzählt hoch.atundX-XICBOT-Deliverybleiben für alle Versuche eines Ereignisses gleich; eine Wiederholung erkennen Sie darum anX-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:
| Kennzeichen | Anzeige 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 Text | die 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
conversationsnur 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 key | Inhalt |
|---|---|
id | Kennung des Schlüssels |
name | Bezeichnung |
prefix | die ersten 12 Zeichen |
scopes | Liste der Bereiche |
limit_per_min | Anfragen pro Minute |
last_used_at | letzte Nutzung nach ISO 8601, sonst null |
expires_at | Ablauf nach ISO 8601, sonst null |
withdrawn | Zeitpunkt des Zurückziehens, sonst null |
valid | true, 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 webhook | Inhalt |
|---|---|
id | Kennung des Webhooks |
url | Zieladresse |
events | abonnierte Ereignisse |
is_active | true, solange eingeschaltet |
failures_in_row | Fehlschläge in Folge |
disabled_at | Zeitpunkt der automatischen Abschaltung, sonst null |
secret_hash | die ersten 12 Zeichen des SHA-256-Abdrucks des Geheimnisses |
Fehlerantworten
| Status | Kennzeichen | Bedeutung |
|---|---|---|
402 | plan_feature_missing | Die 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. |
403 | role_too_low | Rolle zu niedrig; required nennt admin oder beim Bereich conversations owner. |
403 | no_tenant, tenant_<status> | Kein Konto zugeordnet oder Konto nicht aktiv. |
404 | not_found | Schlü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.“ |
422 | too_many_keys | 10 gültige Schlüssel sind erreicht; limit nennt die Grenze. |
422 | url_unreadable, scheme_not_allowed, name_unresolvable, target_not_allowed | Die Zieladresse ist nicht zugelassen. |
422 | Feldfehler | Pflichtfeld 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.
Selbst fragen, Assistent dieser Website
Automatischer Assistent