Schnittstelle: öffentliche Wege
Registrierung, Anmeldung, Passwort, Status, Kontaktanfrage, Demo, Einladung und Warenkorbabholung: alle Schnittstellenwege ohne Sitzung.
In einfacher Sprache
Die Wege auf dieser Seite brauchen keine Anmeldung. Über sie legen Sie ein Konto an und melden sich an. Sie setzen dort auch ein vergessenes Passwort zurück. Sie nehmen eine Einladung an. Andere Wege zeigen den Zustand des Dienstes und die Änderungen. Auch die Kontaktanfrage und die Demo gehören dazu. Ihr Shop holt über einen dieser Wege einen Warenkorb ab.
Alle Themen der Dokumentation
Die Wege auf dieser Seite erreichen Sie ohne Sitzung und ohne Widget-Schlüssel. Sie tragen alles, was vor der Anmeldung geschieht – ein Konto anlegen, die Adresse bestätigen, sich anmelden, ein Passwort zurücksetzen, eine Einladung annehmen –, und das, was außerhalb eines Kontos lesbar ist: Betriebszustand, Änderungsprotokoll, Erklärung zur Barrierefreiheit, Kontaktanfrage, Demo und die Abholung eines Warenkorbs durch Ihren Shop. Die Wege des Widgets beschreibt Widget-Wege, die Anmeldung für alle übrigen Wege Anmeldung an der Schnittstelle.
Überblick
| Methode | Pfad | Zweck | Grenze je Herkunft (Zähler) |
|---|---|---|---|
| POST | /api/v1/register | Konto und Mandant anlegen | 5 je Minute, 20 je Stunde (register) |
| POST | /api/v1/verify | Adresse bestätigen | 30 je Minute (auth-token) |
| POST | /api/v1/login | Anmelden, auch der zweite Schritt | Fehlversuche: 5 je Minute und 20 je Stunde je Adresse und Herkunft; falsche Zugangsdaten zusätzlich 30 je Minute und 300 je Stunde je Herkunft |
| POST | /api/v1/password/forgot | Link für ein neues Passwort anfordern | 20 je Stunde (password-forgot), dazu 3 je Stunde je Adresse und Herkunft |
| POST | /api/v1/password/reset | Neues Passwort setzen | 30 je Minute (auth-token) |
| GET | /api/v1/public/status | Betriebszustand | 30 je Minute (status) |
| GET | /api/v1/public/changelog | Änderungsprotokoll | 30 je Minute (status) |
| POST | /api/v1/public/enquiry | Kontaktanfrage senden | 5 je Minute (enquiry) |
| POST | /api/v1/public/demo | Demo anlegen | 2 je Minute (demo), höchstens 3 neue Demos je IP-Adresse in 24 Stunden |
| GET | /api/v1/public/demo/{id} | Stand einer Demo | 30 je Minute (status) |
| GET | /api/v1/public/accessibility | Erklärung zur Barrierefreiheit | 30 je Minute (status) |
| GET | /api/v1/invitation/{token} | Einladung ansehen | 20 je Minute (invitation) |
| POST | /api/v1/invitation/accept | Einladung mit neuem Konto annehmen | 20 je Minute (invitation) |
| GET | /api/v1/cart/pickup/{token} | Warenkorb abholen | 60 je Minute (cart-pickup) |
Gemeinsame Regeln
Alle Pfade beginnen mit https://app.xicbot.de/api/v1/; die App ruft sie von diesem Ursprung aus auf. Senden Sie JSON mit Content-Type: application/json und Accept: application/json. Fehler unter /api/ kommen als JSON zurück, auch für unbekannte Pfade. Die Prüfung der Felder antwortet mit 422, einem Text in message und je Feld einer Liste von Meldungen in errors.
Grenzen
Gezählt wird je Herkunft: eine IPv4-Adresse für sich, eine IPv6-Adresse gekürzt auf ihr /64-Netz. Eine IPv4-Adresse in IPv6-Schreibweise wie ::ffff:192.0.2.10 zählt als IPv4. Minuten- und Stundengrenze sind getrennte Zähler; beide müssen frei sein. Wege mit demselben Zähler teilen ihn: status gilt für Betriebszustand, Änderungsprotokoll, Demo-Abfrage und Barrierefreiheit zusammen, auth-token für Bestätigung und neues Passwort, invitation für beide Einladungswege. Ist eine Grenze erreicht, antwortet der Weg mit 429 und dem Kopf Retry-After in Sekunden.
Anmeldung und Passwortanforderung haben zusätzlich eigene Zähler. Deren 429 trägt {"error": "too_many_attempts", "retry_in": …}; retry_in nennt die Sekunden bis zum nächsten erlaubten Versuch. Die Grenzen der übrigen Wege stehen unter Grenzen der Schnittstelle.
Fehlerantworten
| Status | Inhalt | Bedeutung |
|---|---|---|
| 404 | {"error": "route_unknown"} | Den Pfad gibt es nicht. |
| 405 | {"error": "method_not_allowed", "allowed": […]} | Den Pfad gibt es, die Methode nicht; allowed nennt die erlaubten Methoden. |
| 422 | message und errors oder {"error": "…"} | Felder ungültig, Token nicht gültig oder Anfrage fachlich abgelehnt. |
| 429 | Kopf Retry-After; bei Anmeldung und Passwort too_many_attempts mit retry_in | Grenze erreicht. |
| ab 500 | message lautet Serverfehler | Unerwarteter Fehler auf dem Server. Ausnahmeklasse, Datei, Zeile und Aufrufweg werden entfernt. Ersetzt wird nur ein vorhandenes message; eine Antwort ohne message bekommt keines. |
Aufrufe aus dem Browser
Aus dem Browser einer anderen Website sind nur die Wege unter /api/v1/public/ lesbar, und nur für die zugelassenen Ursprünge; Ursprünge, Methoden, Köpfe und die Gültigkeit der Vorabfrage stehen unter Schnittstelle: Grundlagen. Registrierung, Anmeldung, Passwort und Einladung sind für fremde Ursprünge nicht freigegeben; die Warenkorbabholung regelt ihre Freigabe selbst, wie weiter unten beschrieben.
Konto anlegen
POST /api/v1/register
Legt ein Konto an, dazu einen neuen Mandanten mit dem Firmennamen, dessen Inhaber das Konto wird, und schickt einen Bestätigungslink an die Adresse. Antwort 201 mit tenant (id, name, slug), user (id, email, role) confirmation_pending: true und mail_sent (liegt die Nachricht mit dem Bestätigungslink in der Schlange). Das Konto erhält die Rolle owner, der slug des Mandanten wird aus dem Firmennamen gebildet.
- Anmeldung
- Keine
- Begrenzung
- 5 je Minute und 20 je Stunde je Herkunft
| Feld | Pflicht | Regel |
|---|---|---|
email | ja | gültige Adresse nach RFC, höchstens 190 Zeichen |
password | ja | mindestens 12 Zeichen, darunter Buchstaben und Ziffern |
password_confirmation | ja | gleich password |
company | ja | höchstens 160 Zeichen; wird der Name des Mandanten |
name | nein | höchstens 120 Zeichen |
locale | nein | de oder en, ohne Angabe de; bestimmt die Sprache der Bestätigungsmail |
Die Adresse wird vor dem Speichern vereinheitlicht: ohne Leerraum am Rand, in Unicode-Normalform C, klein geschrieben und ohne den Zusatz hinter einem Plus. Bei Anbietern, die Punkte im lokalen Teil nicht unterscheiden, fallen auch die Punkte weg. Führt ein Anbieter dasselbe Postfach unter zwei Domains, gilt die Adresse unter beiden als dieselbe. Aus Anna+Test@example.com wird so anna@example.com. Ein lokaler Teil in Anführungszeichen bleibt ungefaltet. Ist die vereinheitlichte Adresse schon vergeben, auch durch ein gelöschtes Konto, antwortet der Weg mit 422 und {"error": "validation", "fields": {"email": ["validation.unique"]}}. In der App heißt dieser Schritt Konto anlegen, die Passwortregel steht dort als Mindestens 12 Zeichen, darunter Buchstaben und Ziffern.
POST /api/v1/verify
Bestätigt die Adresse mit dem Token aus dem Link: {"token": "…"}, höchstens 120 Zeichen. Antwort 200 mit {"confirmed": true}. Ist das Token unbekannt, schon benutzt oder älter als 48 Stunden, antwortet der Weg mit 422 und invalid_token. In der App gehört dazu die Seite Adresse bestätigen.
- Anmeldung
- Keine
- Begrenzung
- 30 je Minute je Herkunft, Zähler
auth-token
Anmelden
POST /api/v1/login
Meldet mit Adresse und Passwort an und gibt ein Token zurück, das Sie an die übrigen Wege als Authorization: Bearer … senden. Die Adresse wird wie bei der Registrierung vereinheitlicht. Antwort 200 mit token, expires_at und user.
- Anmeldung
- Keine
- Begrenzung
- Fehlversuche: 5 je Minute und 20 je Stunde je Adresse und Herkunft; falsche Zugangsdaten zusätzlich 30 je Minute und 300 je Stunde je Herkunft
| Feld | Pflicht | Inhalt |
|---|---|---|
email | ja | Adresse des Kontos, höchstens 190 Zeichen |
password | ja, außer mit challenge | Passwort des Kontos |
totp | nein | Code aus der Authentifizierungs-App, höchstens 10 Zeichen |
challenge | im zweiten Schritt | Aufforderung aus der 428-Antwort, höchstens 80 Zeichen |
webauthn | nein | Objekt mit id (höchstens 1400 Zeichen), client_data_json, authenticator_data und signature (je höchstens 8000 Zeichen) |
locale | nein | de oder en; wird mit einer erfolgreichen Anmeldung zur Sprache des Kontos, in der etwa Einladungen, die Sie verschicken, und die Mail nach einem Passwortwechsel hinausgehen. Ein anderer Wert lässt die bisherige Sprache stehen; die Anmeldung scheitert daran nicht |
Zweiter Faktor
-
Schritt 1
Passwort senden
Hat das Konto einen zweiten Faktor und fehlt
totp, antwortet der Weg mit 428.erroristtotp_required, wenn eine Authentifizierungs-App eingerichtet ist, sonstwebauthn_required. Dazu kommenchallenge,expires_inmit 600 Sekunden undmethodsmit den Faktoren, die sich im zweiten Schritt verwenden lassen:totp,webauthnoder beide. Hat das Konto nur Sicherheitsschlüssel und ist die Anmeldung per Schlüssel auf dem Server nicht eingerichtet, kommt statt der 428 schon hier 503webauthn_unconfigured. Ist eine Authentifizierungs-App eingerichtet, können Sietotpgleich mit dem Passwort senden und sparen den zweiten Schritt; an einem Konto ohne App ergibt ein mitgesendeter Codebad_totp. -
Schritt 2
Sicherheitsschlüssel vorbereiten
Sind Sicherheitsschlüssel hinterlegt und ist die Anmeldung per Schlüssel auf dem Server eingerichtet, enthält die Antwort ein Objekt
webauthnmitchallenge,rp_id,allow(die zugelassenen Schlüsselkennungen) undtimeout, mindestens 30. Damit fordern Sie im Browser die Bestätigung am Schlüssel an. -
Schritt 3
Nachweis senden
Senden Sie
email,challengeund entwedertotpoderwebauthn, ohne Passwort und von derselben IP-Adresse wie im ersten Schritt. Die Aufforderung gilt 600 Sekunden und verfällt beim fünften Fehlversuch; als Fehlversuch zählen ein falscher Code, ein abgelehnter Schlüssel und ein Aufruf von einer anderen IP-Adresse. Ein solcher Aufruf ergibt 422challenge_expired, lässt die Aufforderung für die ursprüngliche Adresse aber bestehen. Ist sie abgelaufen oder schon verbraucht, antwortet der Weg ebenfalls mit 422challenge_expired, und Sie beginnen wieder mit dem Passwort.
| Status | error | Bedeutung |
|---|---|---|
| 200 | – | angemeldet; token, expires_at und user |
| 422 | bad_credentials | Adresse oder Passwort falsch |
| 428 | totp_required, webauthn_required | zweiter Faktor nötig |
| 422 | bad_totp | Code falsch |
| 422 | bad_webauthn | Schlüssel abgelehnt; reason nennt den Grund, etwa kennung_unbekannt |
| 422 | challenge_expired | Aufforderung abgelaufen oder verbraucht, oder Aufruf von einer anderen IP-Adresse |
| 422 | webauthn_not_offered | Schlüsselunterschrift auf eine Aufforderung ohne Schlüsselweg (methods ohne webauthn); zählt nicht als Fehlversuch |
| 503 | webauthn_unconfigured | der Dienst nimmt keine Sicherheitsschlüssel an, weil die Anmeldung per Schlüssel auf dem Server nicht eingerichtet ist; bei einem Konto nur mit Sicherheitsschlüsseln schon auf das Passwort hin |
| 403 | tenant_paused, tenant_suspended, tenant_deleted | Mandant pausiert, gesperrt oder gelöscht; gemeldet erst nach richtigen Zugangsdaten und zweitem Faktor |
| 429 | too_many_attempts | zu viele Fehlversuche; retry_in in Sekunden |
Feld in user | Inhalt |
|---|---|
id, email, name, role, locale | Stammdaten des Kontos |
totp_active | Authentifizierungs-App eingerichtet |
webauthn_keys | Zahl der hinterlegten Sicherheitsschlüssel |
email_verified | Adresse bestätigt |
operator | Konto des Plattformbetriebs |
available, available_at | ob das Konto gerade Übergaben aus Gesprächen annimmt, und seit wann; nimmt es keine an, ist available_at null |
Das Token gilt 30 Tage; der genaue Zeitpunkt steht in expires_at. Als Namen trägt es die Kennung des Browsers aus User-Agent, höchstens 190 Zeichen, oder sitzung, wenn keine gesendet wurde. Auf den Zähler für Adresse und Herkunft geht jeder Fehlversuch: falsche Zugangsdaten, ein falscher Code, ein abgelehnter Schlüssel und eine abgelaufene Aufforderung oder eine von einer anderen IP-Adresse. Der Zähler je Herkunft allein zählt nur falsche Zugangsdaten. Eine erfolgreiche Anmeldung setzt den Zähler für Adresse und Herkunft zurück, den Zähler je Herkunft nicht. Die App zeigt bei 429 Zu viele Versuche. Bitte warten Sie einen Moment. und bei einem gesperrten Mandanten Dieses Konto ist gesperrt. Bitte schreiben Sie an mail@xicbot.de. Mehr zu Sitzungen und zweitem Faktor unter Anmelden und Zugang und Konto und Sicherheit.
Passwort zurücksetzen
POST /api/v1/password/forgot
Fordert einen Link für ein neues Passwort an. Felder: email (Pflicht, höchstens 190 Zeichen) und locale (de oder en; ohne Angabe gilt die Sprache des Kontos). Die Antwort ist 200 mit {"ok": true}, gleich ob es das Konto gibt. Eine Mail erhalten nur Konten, die ein Passwort haben.
- Anmeldung
- Keine
- Begrenzung
- 20 je Stunde je Herkunft; 3 je Stunde je Adresse und Herkunft; Versand höchstens 10 je Stunde je Postfach
Der Link führt auf https://app.xicbot.de/kennwort/neu?token=…&sprache=de und gilt 60 Minuten. Jeder neu verschickte Link ersetzt den vorigen. Je Postfach gehen höchstens zehn Links in der Stunde hinaus, gleich aus welchem Netz sie angefordert werden; darüber bleibt die Antwort 200, es geht keine Mail hinaus, es entsteht kein neuer Link, und der zuletzt verschickte bleibt gültig. Mit 429 antworten nur die beiden Grenzen je Herkunft: die für Adresse und Herkunft zusammen (3 je Stunde; sie zählt jede Anforderung, gleich ob es das Konto gibt) mit too_many_attempts und retry_in, die für die Herkunft allein (20 je Stunde) mit dem Kopf Retry-After. In der App heißen Einstieg und Schaltfläche Passwort vergessen? und Link anfordern.
POST /api/v1/password/reset
Setzt das neue Passwort. Felder: token (höchstens 120 Zeichen), password und password_confirmation nach denselben Regeln wie bei der Registrierung. Antwort 200 mit {"ok": true, "sessions_ended": true}: der Link ist verbraucht, und alle Token des Kontos aus Anmeldung und Einladung sind gelöscht, laufende Sitzungen damit beendet. API-Schlüssel des Mandanten sind davon getrennt und bleiben bestehen. Ein unbekanntes oder abgelaufenes Token ergibt 422 invalid_token. Die Schaltfläche in der App heißt Passwort speichern.
- Anmeldung
- Keine
- Begrenzung
- 30 je Minute je Herkunft, Zähler
auth-token
Betriebszustand und Änderungsprotokoll
GET /api/v1/public/status
Liefert state, measured, parts und time. parts führt im Normalfall neun Teile des Dienstes mit name und state; scheitert die Messung als Ganzes, steht dort nur ein Teil total mit unknown. Die Antwort wird bis zu 20 Sekunden zwischengespeichert. Der HTTP-Status folgt dem Gesamtzustand in state.
- Anmeldung
- Keine
- Begrenzung
- 30 je Minute je Herkunft, Zähler
status
state | Bedeutung | HTTP |
|---|---|---|
operational | jeder Teil gemessen und in Ordnung | 200 |
degraded | alle Teile gemessen, mindestens einer gestört | 503 |
unknown | mindestens ein Teil nicht gemessen | 503 |
GET /api/v1/public/changelog
Liefert das Änderungsprotokoll mit measured, reason, version (die neueste Fassung) und entries. Jeder Eintrag hat version, date, kind, title und points. kind ist feature, fix, security oder note; andere Werte erscheinen als note. Einträge ohne Fassung, Datum oder Titel fallen weg. Sortiert wird nach Datum absteigend, bei gleichem Datum nach Fassung. Ist das Protokoll nicht lesbar, antwortet der Weg mit 503, measured: false, einem kurzen deutschen Grund in reason und leerem entries.
- Anmeldung
- Keine
- Begrenzung
- 30 je Minute je Herkunft, Zähler
status
Kontaktanfrage
POST /api/v1/public/enquiry
Nimmt eine Kontaktanfrage an, wie sie das Formular auf xicbot.de sendet. Die Anfrage wird gespeichert und per Mail zugestellt. Antwort 202 mit {"accepted": true}; mehr erfährt der Absender nicht, weder eine Kennung noch den Stand der Zustellung.
- Anmeldung
- Keine
- Begrenzung
- 5 je Minute je Herkunft
| Feld | Pflicht | Regel |
|---|---|---|
name | ja | 2 bis 120 Zeichen |
email | ja | gültige Adresse nach RFC, höchstens 190 Zeichen |
company | nein | höchstens 160 Zeichen |
topic | nein | ein Schlüssel aus der Thementabelle |
package | nein | start, pro oder custom: das Paket, aus dessen Karte im Preisband die Anfrage kam. Es steht in der Mail als erste Zeile im Block „Projekt“; ein anderer Wert ergibt 422 |
details | nein | Objekt nur mit den Schlüsseln aus der Detailtabelle; andere Schlüssel ergeben 422 |
message | nein | 10 bis 5000 Zeichen |
language | nein | de oder en, ohne Angabe de |
homepage | nein | Fangfeld für Automaten, muss leer bleiben; höchstens 200 Zeichen |
topic | Thema in der Mail |
|---|---|
website-assistant | Website-Assistent |
shop-assistant | Shop-Assistent |
booking-assistant | Termin-Assistent |
lead-assistant | Lead-Assistent |
support-assistant | Support-Assistent |
tool-control | Tool-Steuerung |
chatbot-replacement | Bestehenden Chatbot ersetzen |
other | Etwas anderes |
Schlüssel in details | Bezeichnung in der Mail | Regel |
|---|---|---|
website | Website oder Shop | höchstens 190 Zeichen |
platform | Shopsystem | höchstens 120 Zeichen |
sources | Quellen für Antworten | höchstens 300 Zeichen |
calendar | Terminvergabe heute | höchstens 300 Zeichen |
goal | Gebraucht vom Interessenten | höchstens 300 Zeichen |
ticket_system | Supportanfragen heute | höchstens 300 Zeichen |
systems | Anzubindende Systeme | höchstens 300 Zeichen |
actions | Aktionen darin | höchstens 300 Zeichen |
gap | Fehlt am bisherigen Chat | höchstens 300 Zeichen |
volume | Anfragen im Monat | lt-100 (unter 100), 100-500 (100 bis 500), 500-2000 (500 bis 2.000), gt-2000 (über 2.000), unknown (Weiß ich nicht) |
timeframe | Start | asap (So bald wie möglich), quarter (In 1–3 Monaten), half-year (In 3–6 Monaten), open (Noch offen) |
Demo
POST /api/v1/public/demo
Legt für eine öffentliche Website einen befristeten Demo-Zugang an: einen Mandanten mit einem Assistenten, der nur aus dem Wissen dieser Website antwortet, und ein Widget, das nur auf dieser Website läuft. Die Website wird im Hintergrund eingelesen. Felder: url (Pflicht, http oder https, höchstens 500 Zeichen), email (höchstens 190 Zeichen, wird zur Demo gespeichert) und language (de oder en, ohne Angabe de; Sprache des Assistenten). Antwort 201 mit dem Objekt demo; läuft für dieselbe Website schon eine Demo, 200.
- Anmeldung
- Keine
- Begrenzung
- 2 je Minute je Herkunft; höchstens 3 neue Demos je IP-Adresse in 24 Stunden
Maßgeblich ist der Host der Adresse: klein geschrieben, ohne www. und ohne den Standardport des Schemas. https://www.example.com/kontakt und https://example.com/ ergeben also dieselbe Demo für example.com; ein abweichender Port bleibt Teil des Hosts. Läuft für diesen Host schon eine aktive Demo, bekommen Sie diese mit existing: true zurück; es wird keine neue angelegt und nichts auf die Tagesgrenze angerechnet. Das Widget der Demo ist auf den Host ohne Port beschränkt.
| Status | error | Bedeutung |
|---|---|---|
| 201 | – | Demo angelegt |
| 200 | – | für diesen Host lief schon eine Demo (existing: true) |
| 422 | invalid_url | Adresse ohne auswertbaren Host |
| 422 | scheme_not_allowed, url_unreadable, name_unresolvable, target_not_allowed | Schema nicht http oder https, Adresse nicht lesbar, Name nicht auflösbar oder Ziel nicht zugelassen |
| 429 | demo_ip_limit | von dieser IP-Adresse schon drei Demos in 24 Stunden |
| 503 | demo_capacity | 50 Demos laufen gleichzeitig |
| 500 | demo_unconfigured | Demo auf dem Server nicht eingerichtet |
Feld in demo | Inhalt |
|---|---|
id | Kennung der Demo für die Abfrage |
host | Host, für den die Demo gilt |
expires_at | Ablauf, 72 Stunden nach dem Anlegen |
expired | true, sobald die Frist vorbei ist |
widget_key | öffentlicher Schlüssel des Widgets der Demo |
assistant | id, name und status des Assistenten |
knowledge | Stand des Einlesens mit status, documents und chunks; new und running heißen „läuft noch“, nicht „leer“ |
existing | nur beim Anlegen: ob die Demo schon bestand |
job | nur beim Anlegen einer neuen Demo: Kennung des Auftrags, der die Website einliest |
GET /api/v1/public/demo/{id}
Liefert den aktuellen Stand als demo mit den Feldern oben, ohne existing und job. Eine abgelaufene Demo ist kein Fehler: die Antwort bleibt 200 mit expired: true und nennt weiter die Frist. 404 not_found, wenn die Kennung zu keiner Demo gehört oder die Demo nicht mehr aktiv ist.
- Anmeldung
- Keine
- Begrenzung
- 30 je Minute je Herkunft, Zähler
status
Erklärung zur Barrierefreiheit
GET /api/v1/public/accessibility
Liefert die Erklärung zur Barrierefreiheit der App als Objekt accessibility mit den Textfeldern standard, conformance, checked_on, version, method, scope und feedback sowie den Listen measures und limitations. Die Seite https://app.xicbot.de/barrierefreiheit liest sie ohne Anmeldung. Ist keine Erklärung hinterlegt, antwortet der Weg mit 503 accessibility_missing statt mit leerem Text.
- Anmeldung
- Keine
- Begrenzung
- 30 je Minute je Herkunft, Zähler
status
Einladung annehmen
Eine Einladung aus dem Team kommt als Link https://app.xicbot.de/einladung?token=…&sprache=de und gilt 168 Stunden. Das Token hat 48 Zeichen; gespeichert wird nur sein SHA-256-Wert. Wie Einladungen entstehen und welche Rolle was darf, steht unter Team und Rollen.
GET /api/v1/invitation/{token}
Zeigt, was hinter einem Token steht: tenant (Name des Mandanten), email, role (viewer, editor oder admin), expires_at und account_exists, ob es für diese Adresse schon ein Konto gibt; ein gelöschtes Konto zählt dabei nicht mit. Ist die Einladung unbekannt, abgelaufen, angenommen oder zurückgezogen, antwortet der Weg mit 404 invalid_token.
- Anmeldung
- Keine
- Begrenzung
- 20 je Minute je Herkunft, Zähler
invitation
POST /api/v1/invitation/accept
Nimmt die Einladung mit einem neuen Konto an. Felder: token (höchstens 120 Zeichen), password und password_confirmation nach den Regeln der Registrierung, name (höchstens 120 Zeichen) und locale (de oder en, ohne Angabe de). Die Adresse gilt damit als bestätigt. Antwort 201 mit token (30 Tage gültig), expires_at, user (id, email, name, role, locale) und tenant (id, name). 422 invalid_token, wenn die Einladung nicht mehr offen ist oder das einladende Konto gelöscht wurde; 409 login_required mit email, wenn es für die Adresse schon ein Konto gibt, das nicht gelöscht ist. Ein gelöschtes Konto mit dieser Adresse wird wiederhergestellt und beginnt wie ein neues: mit dem Passwort aus dieser Anfrage, ohne zweite Stufe, ohne Sicherheitsschlüssel und ohne frühere Token. Ohne Protokolleintrag entstehen weder Konto noch Mitgliedschaft, die Einladung bleibt offen, und die Antwort ist 500 mit nur {"error":"not_logged"}, ohne message.
- Anmeldung
- Keine
- Begrenzung
- 20 je Minute je Herkunft, Zähler
invitation
Warenkorb abholen
Stellt der Assistent im Gespräch einen Warenkorb zusammen, gibt das Warenkorbwerkzeug dem Besucher als next_url eine Adresse zu Ihrem Shop: die dort eingetragene Übergabeadresse mit angehängtem ?token=…, oder &token=…, wenn die Adresse schon eine Abfrage enthält. Bis dahin liegt der Warenkorb bei XICBOT. Im Widget erscheint dazu der Link Weiter, der next_url in einem neuen Tab öffnet. Ihr Shop liest mit dem Token den Warenkorb ab und legt daraus seinen eigenen an. Ändert der Assistent den offenen Warenkorb, bleibt das Token gleich; stellt er den Warenkorb ganz neu zusammen, entsteht ein neuer mit neuem Token. Die Einrichtung beschreiben Katalog und Shop und Werkzeuge.
GET /api/v1/cart/pickup/{token}
Liefert den Warenkorb zum Token. Das Token besteht aus 40 Buchstaben und Ziffern und ist der einzige Zugang. Der Weg liest nur: er ändert weder den Warenkorb noch dessen Frist und lässt sich wiederholen. Die Antworten 200, 404 und 410 tragen Cache-Control: no-store.
- Anmeldung
- Keine; das Token im Pfad
- Begrenzung
- 60 je Minute je Herkunft
| Feld | Inhalt |
|---|---|
items | Posten mit external_id, title, amount und unit_price_cents; price_source ist live (eben im Shop gelesen) oder stand (aus dem Katalog) und fehlt bei älteren Warenkörben |
subtotal_cents, discount_cents, shipping_cents, total_cents | Beträge in Cent |
coupon_code | eingelöster Gutscheincode |
currency | Währung des Warenkorbs |
created_at, updated_at | Anlage und letzte Änderung |
expires_at | Ende der Abholfrist |
| Status | error | Bedeutung |
|---|---|---|
| 200 | – | Warenkorb |
| 404 | unknown_cart | Token unbekannt oder falsch geformt, oder der Mandant ist nicht aktiv |
| 410 | cart_expired | Token war gültig, die Abholfrist ist vorbei |
Die Frist beträgt 7 Tage ab der letzten Änderung; ändert der Assistent den Warenkorb im Gespräch, beginnt sie neu. Die Antwort enthält keine Kennung des Mandanten, des Gesprächs oder der Übergabe und nichts über den Besucher: wer das Token hat, hat den Warenkorb, nicht das Gespräch.
Befehl in der Schale bash
curl https://app.xicbot.de/api/v1/cart/pickup/<token> \
-H 'Accept: application/json'Häufige Fragen
Warum meldet der Statusweg 503, obwohl die App erreichbar ist?
Der Weg antwortet nur dann mit 200, wenn alle Teile gemessen wurden und in Ordnung sind. Ist einer gestört, lautet state degraded; wurde einer nicht gemessen, unknown. Welcher Teil es ist, steht in parts.
Verrät die Passwortanforderung, ob es ein Konto gibt?
Nein. Die Antwort ist 200 mit {"ok": true}, ob es das Konto gibt oder nicht und ob eine Mail hinausgeht. Die Grenzen, die mit 429 antworten, zählen jede Anforderung, gleich ob es das Konto gibt.
Wie lange gilt ein Token aus Anmeldung oder Einladung?
30 Tage; der Zeitpunkt steht in expires_at. Wer über /api/v1/password/reset ein neues Passwort setzt, löscht alle Token des Kontos auf einmal; API-Schlüssel sind davon nicht betroffen.
Kann eine Seite den Warenkorb direkt im Browser abholen?
Nur vom Ursprung der Übergabeadresse, die im Warenkorbwerkzeug des Assistenten eingetragen ist. Jede andere Seite bekommt keine Freigabe. Vorgesehen ist der Abruf durch den Server des Shops.
Was passiert, wenn dieselbe Website zweimal als Demo angefragt wird?
Läuft für den Host noch eine aktive Demo, kommt sie mit 200 und existing: true zurück. Es entsteht keine zweite, und die Anfrage zählt nicht zur Grenze von drei Demos je IP-Adresse.
Selbst fragen, Assistent dieser Website
Automatischer Assistent