Schnittstelle: Paketsperren und Drosseln
Welche Wege der Schnittstelle an Merkmalen und Zahlgrenzen des Pakets hängen, welche Drosseln gelten und wie die Antworten mit 402, 429 und 503 aussehen.
In einfacher Sprache
Die Schnittstelle setzt Anfragen Grenzen. Das gebuchte Paket entscheidet, ob ein Weg offen ist. Es legt auch fest, wie viele Assistenten und Quellen Sie anlegen können. Zähler begrenzen, wie oft Sie einen Weg in einer Zeit aufrufen. Diese Seite nennt jede Grenze. Sie sagt, welche Antwort bei einer Ablehnung kommt. Und sie zeigt, wie Sie damit umgehen.
Alle Themen der Dokumentation
Die Schnittstelle begrenzt Anfragen auf zwei Arten: über das gebuchte Paket und über Zähler. Das Paket entscheidet, ob ein Weg überhaupt offensteht und welche Zahlgrenzen für Assistenten, Wissensquellen, Dokumente, Abschnitte und Sitzplätze beim Anlegen geprüft werden. Zähler begrenzen, wie oft ein Weg in einem Zeitfenster aufgerufen wird. Diese Seite nennt jede Sperre mit Weg, Wert und Antwort. Den Überblick über Pakete und Kontingent gibt Pakete und Kontingente.
Paketsperre und Paketgrenzen
Wege, die an ein Paketmerkmal, eine Ja/Nein-Grenze des Pakets oder eine Zahlgrenze gebunden sind, prüfen das Paket des Kontos, bevor sie etwas tun. Die Ablehnung trägt den Status 402 und unterscheidet sich damit von einer fehlenden Rolle (403): Eine Rolle kann jemand im Konto vergeben, ein fehlendes Merkmal oder eine höhere Grenze bringt nur ein anderes Paket. Eine Zahlgrenze gilt als erreicht, sobald der Bestand die Grenze erreicht. Bei einer Grenze von 1 scheitert also der zweite Assistent.
| Status | error | Weitere Felder | Bedeutung |
|---|---|---|---|
| 402 | plan_feature_missing | feature, plan, plan_name und available_in | Dem Paket fehlt das Merkmal, das der Weg braucht, oder eine Ja/Nein-Grenze des Pakets steht auf Nein; feature nennt dann diese Grenze. |
| 402 | plan_limit_reached | limit, allowed, used, plan und plan_name | Die Zahlgrenze ist erreicht, angelegt wird nichts. |
| 503 | plan_limit_unmeasured | limit und reason | Der Bestand konnte nicht gezählt werden, angelegt wird nichts. |
| 500 | plan_gate_misconfigured | kind, feature oder limit | Der Weg ist falsch an das Paket gebunden. Das ist ein Fehler auf unserer Seite. |
| 403 | no_tenant | - | Die Anfrage gehört zu keinem Konto. |
limit und feature nennen die Grenze oder das Merkmal mit dem Schlüssel aus den Tabellen unten. plan ist der Schlüssel des Pakets (etwa start, pro oder custom), plan_name sein Anzeigename (Start, Pro, Individuell). available_in listet die Schlüssel der Pakete, die das Merkmal enthalten. allowed ist die Grenze, used der Bestand. Ein Feld message tragen diese Antworten nicht, auch nicht ab Status 500; maßgeblich ist error.
antwort-402.json json
{
"error": "plan_limit_reached",
"limit": "assistants",
"allowed": 1,
"used": 1,
"plan": "start",
"plan_name": "Start"
}In der App erscheint bei plan_feature_missing „Der Tarif Start enthält diese Funktion nicht. Die Übersicht steht unter Abrechnung.“, bei plan_limit_reached „Die Grenze des Tarifs Start ist erreicht: 1 von 1. Die Übersicht steht unter Abrechnung.“ und bei jeder anderen 402 „Der gebuchte Tarif deckt das nicht ab. Die Übersicht steht unter Abrechnung.“ Statt „Start“ und der Zahlen stehen Ihr Paket und Ihr Stand. Eine 503 zeigt die App als „Der Dienst hat einen Fehler gemeldet. Bitte versuchen Sie es später erneut.“
Merkmale je Weg
Merkmal (feature) | Wege unter /api/v1 | Enthalten in |
|---|---|---|
tool_and_api_control | POST keys, POST webhooks, PUT webhooks/{id} und POST webhooks/{id}/test, jeder Weg unter integration/, dazu Werkzeuge der Bauform http und der Bauformen für angebundene Systeme | Individuell |
conversation_analytics | analytics/* außer analytics/subscription | Pro, Individuell |
shop_integration | catalog/*, darunter catalog/shop, catalog/shop/test und catalog/shop/sync | Pro, Individuell |
appointment_and_lead | records/appointments und records/carts, dazu Werkzeuge der Bauform appointment | Pro, Individuell |
conversation_export | GET conversations/export und GET conversations/{id}/export | Start, Pro, Individuell |
Bei Werkzeugen prüft die Schnittstelle die Bauform beim Anlegen, beim Ändern und bei der Ausführung. Ohne das Merkmal wird ein Werkzeug dieser Bauform weder angelegt noch geändert; die Antwort ist dieselbe 402 mit plan_feature_missing. Die Bauformen für angebundene Systeme sind order_status, order_change, inventory_status, price_lookup, calendar_availability, calendar_booking, crm_lead, crm_activities, callback_note und ticket_create. Termine und Warenkörbe prüfen das Merkmal nur beim Ändern des Status; ihre Listen lassen sich ohne das Merkmal lesen und einzelne Vorgänge löschen. GET records zählt jede Art, und plan_locked nennt die Arten, deren Status sich nicht ändern lässt. conversation_export ist eine Ja/Nein-Grenze des Pakets; fehlt sie, antwortet die Schnittstelle ebenfalls mit 402 plan_feature_missing, feature ist dann conversation_export. Wie die App gesperrte Bereiche zeigt, steht unter Pakete und Kontingente.
Zahlgrenzen je Weg
Weg unter /api/v1 | Geprüfte Grenzen (limit) |
|---|---|
POST assistants | assistants |
POST setup/runs/{id}/accept | assistants |
POST knowledge/sources | knowledge_sources, documents und chunks |
POST setup/runs | knowledge_sources, documents und chunks |
POST knowledge/sources/{id}/refresh | documents und chunks |
POST team/invitations | seats |
Die Grenzen gelten je Konto. Geprüft wird der vorhandene Bestand, bevor der Weg etwas anlegt; ist eine Grenze erreicht, entsteht nichts Neues. Dokumente und Abschnitte entstehen erst beim Einlesen einer Quelle, die Prüfung vergleicht also den Bestand vor dem Einlesen mit der Grenze. Das Wiederherstellen einer Quelle prüft keine Zahlgrenze. Bei seats zählen Mitglieder und offene Einladungen zusammen. Mehr zu Sitzplätzen steht unter Team und Rollen.
Die Höhe jeder Grenze je Paket nennt Pakete und Kontingente. Bei einer Ablehnung stehen die Grenze Ihres Kontos in allowed und der Bestand in used.
Benannte Drosseln
Neben dem Paket begrenzen benannte Drosseln die Zahl der Aufrufe. Jeder Name hat eigene Zähler, ein erschöpfter Name sperrt also nur die Wege, die ihn tragen. Die Werte gelten je Minute; wo zusätzlich eine Stundenzahl steht, zählt sie getrennt, und die Anfrage wird abgewiesen, sobald einer der beiden Zähler erschöpft ist. Eine Überschreitung ergibt 429, in der App erscheint „Zu viele Versuche. Bitte warten Sie einen Moment.“ Allgemeines zu den Statuscodes steht unter Grundlagen der Schnittstelle.
Je Person
Diese Drosseln zählen je angemeldeter Person. Ohne Anmeldung zählt ersatzweise die Herkunft der Anfrage. Wer mehreren Konten angehört, nutzt denselben Zähler in allen Konten; nur dpa zählt je Konto und Person getrennt. password-change ist ein gemeinsamer Zähler für drei Wege.
| Name | Je Minute | Wege unter /api/v1 |
|---|---|---|
knowledge-sources | 20 | POST knowledge/sources, Neu einlesen, Wiederherstellen und Einbetten einer Quelle, POST setup/runs |
knowledge-search | 60 | Suche im Wissen |
knowledge-ask | 30 | Frage an das Wissen |
knowledge-probes | 6 | Probefragen ausführen |
knowledge-tune | 2 | Abstimmung anhand der Probefragen |
assistants | 30 | Assistent anlegen und ändern, Fassung anlegen und wiederherstellen, POST assistants/{id}/key, Abnahmelauf starten, Prüffragen anlegen und ändern, Werkzeuge anlegen und ändern; Löschen ist nicht gedrosselt |
conversations | 30 | Gespräche anlegen, gesamt oder einzeln exportieren, bewerten, im Klartext zeigen und Anhänge abrufen; GET analytics/report |
conversation-send | 20 | POST conversations/{id}/send |
catalog | 20 | Produkte anlegen, einführen und ändern; Shopanbindung speichern, prüfen und abgleichen |
privacy | 5 | Datenexport des Kontos, Einwand gegen Unterauftragsverarbeiter, Aufbewahrung und Löschauftrag |
dpa | 10 | Weg zur Auftragsverarbeitung |
key | 10 | POST keys, POST webhooks und POST webhooks/{id}/test |
confirmation | 3 | Bestätigungsmail erneut senden |
invitations | 5 | POST team/invitations |
tenant-switch | 20 | Konto wechseln |
password-change | 5 | Passwort ändern, Code-Verfahren entfernen und Sicherheitsschlüssel entfernen |
Je Herkunft
Diese Drosseln gelten für Wege ohne Anmeldung und zählen je Herkunft: bei IPv4 je Adresse, bei IPv6 je /64-Netz. Eine IPv4-Adresse in IPv6-Schreibweise (::ffff:) zählt als IPv4-Adresse. Minuten- und Stundenzähler laufen getrennt.
| Name | Je Minute | Je Stunde | Wege unter /api/v1 |
|---|---|---|---|
status | 30 | - | public/status, public/changelog, Abruf einer Demo mit GET public/demo/{id} und public/accessibility |
enquiry | 5 | - | public/enquiry |
demo | 2 | - | POST public/demo |
register | 5 | 20 | POST register |
password-forgot | - | 20 | POST password/forgot |
auth-token | 30 | - | Bestätigung der Adresse mit POST verify und POST password/reset |
invitation | 20 | - | GET invitation/{token} und POST invitation/accept |
cart-pickup | 60 | - | cart/pickup/{token} |
Je Besucher
Die Wege des Widgets unter /api/v1/public/widget/{key} zählen je Besucher, gebildet aus Herkunft und Widget-Schlüssel zusammen. Besucher mit derselben Herkunft teilen sich den Zähler also nur innerhalb desselben Widget-Schlüssels. Zusätzlich gelten die Deckel des Widgets.
| Name | Je Minute | Wege unter /api/v1/public/widget/{key} |
|---|---|---|
widget-send | 12 | POST send, Bestätigung eines Werkzeugaufrufs und Hochladen eines Anhangs |
widget | 60 | alle übrigen Wege, darunter der Abruf der Einstellungen |
Deckel eines API-Schlüssels
Die Wege unter /api/v1/integration melden sich mit dem Kopf X-Api-Key an, siehe Schnittstelle für Anbindungen. Für sie gelten zwei Deckel, beide gezählt je Schlüssel. Eine aus dem Ruder gelaufene Anbindung hält so die übrigen Schlüssel des Kontos nicht an.
| Deckel | Wert | Zeitfenster |
|---|---|---|
| Je Minute | Feld Anfragen pro Minute beim Anlegen des Schlüssels, 1 bis 6000, ohne Angabe 120 | 60 Sekunden ab dem ersten gezählten Aufruf |
| Je Tag | Tagesgrenze des Kontos, Vorgabe 2.000; der Wert 0 heißt ohne Tagesdeckel | Kalendertag nach UTC, der Zähler beginnt um 00:00 UTC neu, in Deutschland also um 1 Uhr, während der Sommerzeit um 2 Uhr |
- Beide Deckel werden geprüft, bevor einer von beiden zählt. Eine abgewiesene Anfrage verbraucht also nichts. Gezählt wird aber vor der Prüfung des Bereichs: eine Anfrage, die erst am fehlenden Bereich scheitert, zählt auf beiden Deckeln mit.
- Seine Minutengrenze meldet ein Schlüssel über
GET /api/v1/integration/statusim Feldlimit_per_min, siehe Schnittstelle: Integration. - Einen bestehenden Schlüssel können Sie nicht ändern. Für einen anderen Minutenwert legen Sie einen neuen Schlüssel an und ziehen den alten zurück.
- Ein Konto hat höchstens 10 gültige Schlüssel; zurückgezogene und abgelaufene zählen nicht mit. Ein weiterer ergibt 422 mit
too_many_keysundlimit, in der App „Die Höchstzahl gleichzeitiger Schlüssel ist erreicht.“ GET /api/v1/keysnennt die Grenze inlimit_active. Die Seite Schnittstellen zeigt den Stand unter API-Schlüssel etwa als „3 / 10“.
antwort-429.json json
{
"error": "too_many_requests",
"scope": "minute",
"limit": 120,
"retry_after": 42,
"limit_per_min": 120,
"wait": 42
}scope ist minute oder day, limit der überschrittene Deckel und limit_per_min der Minutenwert des Schlüssels. retry_after und wait enthalten dieselbe Wartezeit in Sekunden wie der Kopf Retry-After. Beim Tagesdeckel reicht sie bis zum Tagesende nach UTC, mindestens aber 60 Sekunden.
Deckel des Widgets
Neben den benannten Drosseln hat das Widget zwei eigene Deckel, deren Werte am Konto hängen: einen für Aufrufe und einen für Fragen. Jeder Deckel zählt auf dem Besucher und, wenn der Aufruf zu einem Gespräch gehört, zusätzlich auf dieser Sitzung im Chatfenster. Zu einem Gespräch gehört ein Aufruf, wenn die Gesprächskennung im Pfad oder als conversation_id im Rumpf steht. Jeder Träger kann abweisen; gezählt wird erst, wenn keiner abgewiesen hat.
| Deckel | Wege | Je Minute | Je Tag |
|---|---|---|---|
| Aufrufe | Einstellungen, Start, Verlauf, Bewertung, Widerruf, Auszug und Löschen, dazu Bestätigen, Ablehnen und Rückmeldung eines Werkzeugaufrufs | Wert Anfragen je Minute des Kontos | Tagesgrenze des Kontos, Vorgabe 2.000 |
| Fragen | POST send | Vorgabe 10 | Vorgabe 200 |
- Der Minutenwert für Aufrufe ist der Wert Anfragen je Minute des Kontos. Ein Wechsel auf ein Paket setzt ihn auf dessen Wert: 20 bei Start, 60 bei Pro, 120 bei Individuell. Ist das Konto bereits Individuell, bleibt ein dort hinterlegter Wert stehen.
- Die Tagesgrenze der Aufrufe ist derselbe Wert wie der Tagesdeckel der API-Schlüssel. Für Fragen kann für ein Konto ein anderer Wert als die Vorgabe hinterlegt sein.
- Hochladen und Abrufen von Anhängen fallen nicht unter diese Deckel, dort gelten nur die benannten Drosseln.
- Die Zeitfenster laufen ab dem ersten gezählten Aufruf: 60 Sekunden für die Minute und 86.400 Sekunden für den Tag. Der Tag ist hier kein Kalendertag.
- Ein Deckel unter 1 gilt als abgeschaltet.
- Die Ablehnung lautet 429 mit
too_many_requests,limit_per_min,limit_per_dayundwait, dazu der KopfRetry-After. - Wie das Chatfenster darauf reagiert, steht unter Widget-Auslieferung.
Monatskontingent
Ist das Kontingent des Monats erschöpft, erzeugt der Assistent keine Antworten mehr. Wie das sichtbar wird, hängt vom Weg ab. Das Kontingent selbst beschreibt Pakete und Kontingente.
Schon ab 80 % des Kontingents antwortet der Assistent gedrosselt: eine Antwort ist dann auf 300 Einheiten begrenzt und dreht höchstens eine Werkzeugrunde. Ist das Kontingent aufgebraucht, lehnt der Dienst die Frage ab, bevor eine Antwort erzeugt wird.
| Weg | Antwort |
|---|---|
POST /api/v1/integration/chat | 429 mit quota_exhausted, scope gleich month, month, budget, used und retry_after, dazu der Kopf Retry-After. Die Wartezeit reicht bis zum Monatswechsel, mindestens 60 Sekunden. |
| Widget und Probierdialog in der App | Ein Fehlerereignis mit code gleich quota_exhausted, scope gleich month und retry_after, danach die hinterlegte Notfallantwort des Assistenten. |
| Abnahmelauf | 422 mit quota_exhausted. Die App meldet „Das Kontingent dieses Monats ist aufgebraucht. Ein Lauf würde jede Zeile als nicht messbar verbuchen.“ Siehe Probieren und abnehmen. |
Weitere Zähler
Einige Wege zählen zusätzlich selbst. Ihre Ablehnungen tragen eigene Fehlerkennungen.
Weg unter /api/v1 | Grenze | Gezählt je | Antwort |
|---|---|---|---|
POST login | 5 Fehlversuche je Minute, 20 je Stunde | E-Mail-Adresse und Herkunft | 429 too_many_attempts mit retry_in |
POST login | 30 Fehlversuche je Minute, 300 je Stunde | Herkunft | 429 too_many_attempts mit retry_in |
POST password/forgot | 3 Anforderungen je Stunde | E-Mail-Adresse und Herkunft | 429 too_many_attempts mit retry_in |
POST password/forgot | 10 Mails je Stunde | E-Mail-Adresse | 200 mit {"ok":true}, versandt wird dann nichts |
POST catalog/shop/test | 3 Prüfungen je Minute | Konto | 429 too_many_tests mit retry_after und Kopf Retry-After |
POST catalog/shop/sync | ein Abgleich je 900 Sekunden | Shopanbindung | 429 sync_too_soon mit retry_after, connection und Kopf Retry-After |
POST public/demo | 3 bestehende Demos, angelegt innerhalb von 24 Stunden | IP-Adresse | 429 demo_ip_limit |
POST public/demo | freie Kapazität für Demos | - | 503 demo_capacity |
POST public/widget/{key}/send, POST integration/chat und POST conversations/{id}/send | Fragen je Gespräch, vom Betreiber für jedes Konto einzeln eingestellt: 0 bis 1.000, Vorgabe 60; 0 heißt ohne Höchstzahl | Gespräch | im Ereignisstrom error mit conversation_limit und limit, danach ein Hinweistext und handoff |
Bei der Anmeldung zählen nur Fehlversuche. Eine erfolgreiche Anmeldung gibt den Zähler aus E-Mail-Adresse und Herkunft frei, der Zähler je Herkunft läuft weiter. retry_in nennt die Wartezeit in Sekunden; einen Kopf Retry-After senden Anmeldung und Passwort-Anforderung nicht. Die Grenze von 10 Mails je E-Mail-Adresse ändert die Antwort nicht, die Anfrage endet mit 200. Wartet oder läuft für das Konto schon ein Abgleich, prüft POST catalog/shop/sync die Sperrzeit nicht und antwortet mit 202; already_pending ist dann true.
Umgang mit Ablehnungen
- Unterscheiden Sie nach Status: 402 verlangt ein anderes Paket, 403 eine andere Rolle, 429 eine Pause und 503 mit
plan_limit_unmeasuredeinen späteren Versuch. - Liegt der Kopf
Retry-Aftervor, warten Sie mindestens so viele Sekunden. Sonst werten Sieretry_after,waitoderretry_inaus. - Wiederholen Sie eine 402 nicht in einer Schleife. Sie ändert sich erst mit einem anderen Paket oder einem kleineren Bestand, etwa nach dem Löschen eines Assistenten.
- Geben Sie jeder Anbindung einen eigenen Schlüssel. Minuten- und Tagesdeckel zählen je Schlüssel.
- Der Tagesdeckel eines Schlüssels beginnt um 00:00 UTC neu, der Tagesdeckel des Widgets 86.400 Sekunden nach dem ersten gezählten Aufruf.
Häufige Fragen
Warum antwortet die Schnittstelle mit 402 statt 403?
402 heißt, dass das Paket den Weg nicht abdeckt oder eine Zahlgrenze erreicht ist. 403 steht für eine fehlende Rolle. So erkennen Sie, ob ein anderes Paket oder eine andere Rolle nötig ist.
Teilen sich mehrere API-Schlüssel eines Kontos einen Zähler?
Nein. Minuten- und Tagesdeckel zählen je Schlüssel. Der Wert des Tagesdeckels kommt vom Konto und ist für alle Schlüssel gleich, gezählt wird aber getrennt.
Wann beginnt der Tagesdeckel eines Schlüssels neu?
Um 00:00 UTC. Der Zähler gehört zum Kalendertag nach UTC und verfällt mit dessen Ende.
Gelten die Drosseln je Person über mehrere Konten hinweg?
Ja. Sie zählen je Person, auch wenn diese Person mehreren Konten angehört. Nur dpa zählt je Konto und Person getrennt.
Zählt eine abgewiesene Anfrage mit?
Bei den Deckeln von Schlüssel und Widget nicht. Beide prüfen zuerst alle Zähler und zählen nur, wenn keiner abgewiesen hat.
Selbst fragen, Assistent dieser Website
Automatischer Assistent