Zum Hauptinhalt springen

Kontingente und Ratenbegrenzungen

Kaleidr begrenzt die Nutzung auf zwei unterschiedliche Arten. Beide führen zum HTTP-Status 429:

  • Kontingent bezeichnet die Nutzung, die Ihrer Organisation innerhalb eines Abrechnungszeitraums zusteht. Ist es aufgebraucht, müssen Sie auf die Zurücksetzung warten oder zusätzliches Kontingent erwerben.
  • Ratenbegrenzungen legen fest, wie schnell Sie Anfragen senden dürfen. Beim Erreichen einer Grenze müssen Sie einige Sekunden langsamer vorgehen.

Am Antwortinhalt erkennen Sie, welche Grenze erreicht wurde. Diese Seite zeigt die Antwortformate, die Kosten der einzelnen Aufrufe und die passende Behandlung.

Die beiden Kontingentpools​

Die Nutzung wird pro Organisation in zwei Pools erfasst.

PoolWas den Pool verbrauchtFreeProEnterprise
KI-CreditsChatantworten, Ortsabfragen, Adresssuche, Designanalyse500.000 pro Zeitraum5.000.000 pro ZeitraumIndividuell im Vertrag festgelegt
KartenladungenJede Tile-Sitzung sowie jeder Aufruf einer veröffentlichten oder eingebetteten Karte50.000 pro Zeitraum50.000 pro ZeitraumDerselbe Grundfreibetrag; höhere Volumina werden vertraglich vereinbart

Drei Punkte zu diesen Pools werden häufig missverstanden:

  • KI-Credits bilden einen gemeinsamen Pool für die gesamte Organisation. Ihre API-Schlüssel verwenden dieselben KI-Credits wie Ihr Team in den Kaleidr-Anwendungen. Es gibt kein separates API-Budget; alle Schlüssel teilen sich den Pool.
  • Der Zeitraum entspricht Ihrem Abrechnungszeitraum. Bei einem kostenpflichtigen Abonnement ist dies der monatliche Zyklus ab dem Tag des Abschlusses. Ohne Abonnement gilt der Kalendermonat. Der Wechsel erfolgt um Mitternacht nach US-Ostküstenzeit.
  • Pakete erhöhen die Grenze. Gekaufte Pakete mit KI-Credits oder Kartenladungen kommen zum Tarifkontingent hinzu und sind im Antwortfeld limit enthalten.

Tarifänderungen werden innerhalb weniger Minuten für Ihre bestehenden Schlüssel wirksam. Neue Schlüssel sind nicht erforderlich.

Kosten der einzelnen API-Aufrufe​

AufrufPoolKosten
POST /chat/control/stream, /chat/summary/stream, /chat/button/stream, /spot/overview/streamKI-CreditsDie für die Antwort verwendeten Tokens, Eingabe plus Ausgabe. Siehe Abrechnung eines Streams.
POST /chat/control/routekeinerKostenlos. Während der Routenberechnung wird ein Betrag reserviert und anschließend immer wieder freigegeben.
POST /spotKI-CreditsPauschale pro Aufruf, auch wenn nichts gefunden wird: die Gebühr für /retrieval/poi/enrich, wenn want content oder photos enthält und der Inhalt für diesen Aufruf abgerufen wird; andernfalls die Gebühr für /retrieval/geocode/forward, wenn address angefordert wird. Bereits für eine frühere Anfrage abgerufene Inhalte kosten nichts. Eine reine Abfrage von Orten, Regionen und Umrissen ist kostenlos.
GET /retrieval/poi/enrichKI-CreditsPauschale pro Aufruf, auch ohne gefundenen Inhalt.
GET /retrieval/geocode/forwardKI-CreditsGeringere Pauschale pro Aufruf, auch bei leeren Ergebnissen. Schlägt die Suche selbst fehl, wird nichts berechnet.
POST /design/analyzeKI-CreditsPauschale pro erfolgreichem Aufruf. Bei einem Fehler kostenlos.
POST /design/apply-direct, GET /design/styles, /design/samples, /design/themeskeinerKostenlos.
POST /sdk/sessions für chat, editor, viewerkeinerKostenlos.
POST /sdk/sessions für tileKartenladungenEine Kartenladung pro Sitzungsaustausch.
POST /sdk/share-sessionskeinerKostenlos. Die Chat-Aufrufe mit dieser Sitzung werden dem Karteneigentümer berechnet.
POST /inference-api/vendor/mapping/propose, der Zuordnungsvorschlag der API für das Hochladen von GeschäftsdatenKI-CreditsDie Tokens des Vorschlags. Der Aufruf erfolgt mit einer Kontoanmeldung, nicht mit einem API-Schlüssel. Sind die Credits aufgebraucht, wird 429 quota_exceeded zurückgegeben. Zusätzlich gilt ein Limit von 30 Vorschlägen pro Konto und Stunde; die beiden 429-Antworten haben unterschiedliche Formate. Hochladen, Veröffentlichen, Zurückziehen einer Veröffentlichung und Löschen sind kostenlos.

Ihre aktuelle Nutzung und die Grenzen finden Sie unter kaleidr.com/billing.

Abrechnung eines Streams​

Die Kosten eines Streaming-Aufrufs stehen erst nach dessen Abschluss fest. Deshalb erfolgt die Abrechnung in zwei Schritten:

  1. Reservierung. Sobald eine Anfrage angenommen wird, reserviert das System eine feste Anzahl Credits im Pool. Reicht der Pool dafür nicht aus, wird die Anfrage mit quota_exceeded abgelehnt, noch bevor eine Antwort erzeugt wird. Ein Aufruf benötigt daher ausreichend freie Credits, selbst wenn die tatsächlichen Kosten geringer wären.
  2. Endabrechnung. Nach Ende des Streams wird die Reservierung durch die tatsächlichen Kosten ersetzt: die für die Antwort verwendeten Tokens. Diese können über oder unter der Reservierung liegen.

Wenn Sie einen Stream abbrechen oder er vor Abschluss der Antwort fehlschlägt, ist die Tokenzahl unbekannt. Die Abrechnung erfolgt dann anhand einer Schätzung:

StreamAbrechnung bei vorzeitigem Ende
/chat/control/streamEs gilt der höhere Wert aus einer Schätzung der gesendeten Unterhaltung (die user- und assistant-Nachrichten der Anfrage) und einer Schätzung des bereits gestreamten Texts, die bis zur Höhe der Reservierung erfasst wird. Die Kosten können die Reservierung übersteigen.
/chat/summary/stream, /chat/button/stream, /spot/overview/streamSchätzung des bereits gestreamten Texts, höchstens in Höhe der Reservierung.

Ein frühzeitig geschlossener Chat-Stream macht eine lange Unterhaltung daher nicht kostenlos: Mindestens die Größe der gesendeten Anfrage wird berechnet, unabhängig davon, wie wenig Antwort Sie gelesen haben. Halten Sie Anfragen klein und senden Sie nur die für die nächste Antwort benötigten Gesprächszüge. Siehe Stream lesen.

Wird eine Grenze während eines laufenden Streams erreicht, wird dieser nicht unterbrochen. Die Prüfung erfolgt bei Annahme der Anfrage; erst die nächste Anfrage wird abgelehnt.

Abgelehnte Anfragen werden nicht berechnet. Wird eine Anfrage vor der Verarbeitung abgelehnt (wegen Raten- oder Parallelitätsgrenzen, Validierungsfehlern oder zu großem Request-Body), bleiben anschließend weder KI-Credits noch ein Parallelitätsplatz reserviert. Sie können den Aufruf wiederholen, ohne für die Ablehnung bezahlt zu haben.

Individuelle Grenze für einen Schlüssel​

Ein Schlüssel kann eine monatliche Obergrenze erhalten (monthly_cap_tokens, eingestellt über die Schlüsselverwaltungs-API). Sie begrenzt, wie viele KI-Credits dieser Schlüssel in einem Zeitraum aus dem Organisationspool verbrauchen darf. Die Grenze des Organisationspools gilt weiterhin zusätzlich.

Eine Anfrage, mit der ein begrenzter Schlüssel seine Obergrenze überschreiten würde, wird mit demselben quota_exceeded-Antwortformat abgelehnt. Dabei zeigen limit und used die Werte des Schlüssels statt die des gesamten Pools an.

Kontingent überschritten​

HTTP/1.1 429 Too Many Requests
Retry-After: 1296000
Content-Type: application/json
{
"error": "quota_exceeded",
"detail": "Usage limit reached. Please try again later.",
"product": "b2b",
"meter": "b2b.tokens",
"tier": "pro",
"limit": 5000000,
"used": 4999100,
"remaining": 900,
"reset_at": "2026-11-01T04:00:00+00:00",
"period": "month",
"reset_in_seconds": 1296000
}
FeldBedeutung
errorIn diesem Fall immer quota_exceeded. Verzweigen Sie die Programmlogik anhand dieses Felds.
detailEin für Menschen formulierter Satz. Nicht programmatisch auswerten.
product, meterKennzeichnen den Zähler für KI-Guthaben der API. Bei Plattformschlüsseln immer b2b und b2b.tokens.
tierDer Tarif Ihrer Organisation.
limit, used, remainingDie Guthabenwerte des Pools beziehungsweise die Werte des Schlüssels, wenn ein schlüsselbezogenes Limit die Anfrage abgewiesen hat. remaining kann größer als null sein: Die Anfrage wurde abgewiesen, weil die vorläufige Reservierung nicht mehr hineinpasste.
reset_atDas Ende des Abrechnungszeitraums als ISO-8601-Zeitstempel mit Zeitzonenoffset. Verwenden Sie diesen Wert, um Nutzern mitzuteilen, wann der Dienst wieder verfügbar ist.
periodmonth.
reset_in_secondsSekunden bis reset_at, also bis zum Ende des Zeitraums, in dem sich Ihr Pool zurücksetzt (Ihr Abonnementzyklus oder ohne Abonnement der Kalendermonat). Der Header Retry-After enthält denselben Wert.

Der Antwort-Body ist flach aufgebaut: Alle Felder stehen auf oberster Ebene, nicht innerhalb eines detail-Objekts.

Mit einem Sitzungstoken​

Das oben gezeigte Antwortformat gilt für einen Serverschlüssel oder Legacy-Schlüssel. Eine Anfrage mit einem Sitzungstoken wird im Browser eines Besuchers ausgeführt. Deshalb verrät eine Ablehnung weder den Tarif noch die Nutzung oder die Obergrenze der Organisation. Dies gilt sowohl für Sitzungen, die aus einem veröffentlichbaren Schlüssel erzeugt wurden, als auch für Besuchersitzungen einer veröffentlichten Karte.

{
"error": "quota_exceeded",
"detail": "Usage limit reached. Please try again later.",
"meter": "b2b.tokens",
"reset_at": "2026-11-01T04:00:00+00:00",
"reset_in_seconds": 1296000
}
FeldServerschlüssel oder Legacy-SchlüsselSitzungstoken
error, detailJaJa
meterJaJa
reset_at, reset_in_secondsJaJa
product, periodJaNein
tierJaNein
limit, used, remainingJaNein

Status, Header Retry-After und Bedeutung sind identisch. Prüfen Sie im Browsercode error und zeigen Sie reset_at an; lesen Sie nicht limit, used oder remaining. Nutzungszahlen erhalten Sie auf Ihrem Backend mit einem Serverschlüssel oder unter kaleidr.com/billing.

Wenn der Antwort-Body used: 0 anzeigt, obwohl Ihre Organisation bereits aktiv war, konnte die API die Nutzung nicht abrufen und hat den Aufruf vorsichtshalber abgelehnt. Versuchen Sie es nach einigen Sekunden erneut, statt bis reset_at zu warten.

Ratenbegrenzungen und parallele Anfragen​

Vor jedem Laufzeitaufruf werden drei Grenzen geprüft. Überschüssige Anfragen werden sofort abgelehnt und nicht in eine Warteschlange gestellt.

GrenzeZählung proGeltungsbereich
Anfragen pro MinuteSchlüsselGleitendes 60-Sekunden-Fenster für jeden Laufzeitaufruf mit dem Schlüssel und allen daraus ausgestellten Sitzungen. Alle Besucher einer Website mit demselben veröffentlichbaren Schlüssel teilen sich dieses Budget.
Sitzungsaustausche pro MinuteSchlüsselAufrufe von POST /sdk/sessions. Dafür gilt ein eigenes Budget; das Einbinden von Embeds verbraucht daher keine Laufzeitaufrufe.
Parallele AnfragenOrganisationAlle gleichzeitig laufenden Aufrufe über sämtliche Schlüssel der Organisation. Ein Stream zählt, solange er geöffnet ist.

Der Wert für Anfragen pro Minute eines Schlüssels lässt sich weder auf der API-Keys-Seite noch über die Schlüsselverwaltungs-API ändern. Benötigen Sie für Ihr Anfragevolumen ein höheres Limit, kontaktieren Sie uns.

Alle diese Ablehnungen verwenden dasselbe Antwortformat und denselben Header:

HTTP/1.1 429 Too Many Requests
Retry-After: 5
Content-Type: application/json
{ "error": "rate_limited", "detail": "API key rate limit exceeded. Slow down." }
errorBedeutungWas zu tun ist
rate_limitedDas Budget für Anfragen oder Sitzungsaustausche pro Minute des Schlüssels ist ausgeschöpft.Die in Retry-After angegebenen Sekunden warten und erneut versuchen. Zufällige Verzögerung hinzufügen.
org_overloadedIn Ihrer Organisation laufen zu viele Anfragen gleichzeitig.Warten, bis einer der offenen Aufrufe abgeschlossen ist, und dann erneut versuchen. Nicht mehr benötigte Streams schließen.
b2b_overloadedDie API hat für alle Nutzer ihre Kapazitätsgrenze erreicht.Nach Retry-After Sekunden mit schrittweise längeren Wartezeiten erneut versuchen.
limiter_unavailableDie Ratenbegrenzung konnte nicht antworten.Kurz darauf erneut versuchen. Langsamer zu senden hilft nicht, da dies kein Problem Ihrer Anfragerate ist.
visitor_limit_reachedEin Besucher des Chats einer veröffentlichten Karte hat pro Minute oder Tag zu viele Anfragen gestellt.Dem Besucher anzeigen, dass er es später erneut versuchen soll. Siehe Chat auf einer veröffentlichten Karte.

Zusätzlich werden Anfragen am Netzwerkrand anhand der IP-Adresse und der Zugangsdaten begrenzt. Eine dort blockierte Anfrage enthält keines der auf dieser Seite beschriebenen JSON-Antwortformate. Behandeln Sie eine 4xx-Antwort ohne Kaleidr-Body so, dass Sie zunächst langsamer vorgehen und später erneut versuchen.

Kartenladungen​

Eine Kartenladung wird jedes Mal gezählt, wenn eine Kaleidr-Karte für einen Betrachter gestartet wird:

  • jeder Sitzungsaustausch für product: "tile", einschließlich der Aktualisierung durch das SDK und jedes erneuten Einbindens des Elements;
  • jeder Aufruf einer veröffentlichten oder eingebetteten Karte.

Der Sitzungsaustausch des eingebetteten Editors gilt nicht als Kartenladung. Dessen Basiskartenanfragen, die Ihren veröffentlichbaren Schlüssel enthalten (Stil, Sprites und Schriftarten), werden stattdessen gesammelt abgerechnet: Je 20 dieser Anfragen, die Ihre Organisation innerhalb einer Stunde sendet, kommen nachträglich als eine Kartenladung hinzu. Diese Anfragen werden wegen des Kontingents niemals abgelehnt. Die Kartentile-Daten selbst werden nicht gezählt.

Jeder Tarif stoppt bei seinem Kontingent. Sobald der Pool aufgebraucht ist, wird die nächste Kartenladung abgelehnt und nicht gezählt. In kostenpflichtigen Tarifen gibt es keine zusätzliche Toleranzspanne; ein gekauftes Kartenladungspaket erhöht die Grenze sofort.

Beim Sitzungsaustausch sieht die Ablehnung so aus:

HTTP/1.1 429 Too Many Requests
Content-Type: application/json
{ "detail": "map_load_quota_exceeded" }

Anders als die obige flache Kontingentantwort ist dieser Body in detail gekapselt und enthält keinen Header Retry-After. Erneute Versuche helfen erst nach der Zurücksetzung des Zeitraums oder dem Kauf eines Pakets. Auf der Website startet das Tile-Embed nicht und das SDK protokolliert kaleidr session exchange failed (429).

Direkte Tile-Anfragen​

Der Host für Basiskarten-Tiles ist keine öffentliche Tile-API. Unterstützt wird die Anzeige einer Kaleidr-Basiskarte über das Tile-Produkt. Anfragen an tile.kaleidr.com werden abgelehnt, wenn sie nicht von einem Kaleidr-Embed mit gültigem veröffentlichbarem Schlüssel auf einem zugelassenen Ursprung stammen:

HTTP/1.1 429 Too Many Requests
Retry-After: 3600
Cache-Control: no-store
Content-Type: application/json
{
"error": "tile_access_restricted",
"message": "Direct access to tile.kaleidr.com requires a Kaleidr publishable key. Mint a free one at kaleidr.com/api-keys and pass it as ?key= from an allowed origin. Kaleidr-hosted maps and embeds are unaffected.",
"docs": "https://docs.kaleidr.com/get-an-api-key"
}

Diese Antwort stammt vom Tile-Host, nicht von der Plattform-API. Deshalb verwendet sie message statt des API-Felds detail. Ein neu erstellter oder bearbeiteter Schlüssel kann erst nach einigen Minuten für Tiles zugelassen sein.

Das Ereignis quota in einem Stream​

Ein Chat-Stream meldet den Pool nach erfolgter Abrechnung. Das Ereignis quota ist das letzte Ereignis des Streams und wird nach end oder error gesendet:

event: quota
data: {"type": "quota", "product": "b2b", "meter": "b2b.tokens", "tier": "pro", "used": 184223, "limit": 5000000, "reset_at": "2026-11-01T04:00:00+00:00", "period": "month"}

Das gilt für Streams, die mit einem Serverschlüssel oder Legacy-Schlüssel gelesen werden. Bei einem Stream mit einem Sitzungstoken (aus einem veröffentlichbaren Schlüssel oder einer Besuchersitzung einer veröffentlichten Karte) enthält das Ereignis weder Tarifinformationen noch Zahlenwerte:

event: quota
data: {"type": "quota", "meter": "b2b.tokens", "reset_at": "2026-11-01T04:00:00+00:00"}
FeldServerschlüssel oder Legacy-SchlüsselSitzungstoken
type, meter, reset_atJaJa
product, periodJaNein
tierJaNein
used, limitJaNein

Mit einem Serverschlüssel können Sie damit den Nutzungszähler ohne eine weitere Anfrage aktualisieren. Dabei gelten drei Einschränkungen:

  • Das Feld remaining fehlt. Berechnen Sie limit - used.
  • Das Ereignis wird nach Möglichkeit gesendet. Ein Stream kann ohne dieses Ereignis enden; warten Sie daher nicht darauf.
  • Das Ereignis meldet den Verbrauch, warnt aber nicht. Es erscheint nie während einer laufenden Antwort und kann einen Stream nicht anhalten.

Um das Ereignis zu empfangen, lesen Sie weiter, bis der Antwort-Body geschlossen wird. Ein Client, der bei end aufhört, verpasst es.

Behandlung von 429 im Code​

Lesen Sie vor Ihrer Entscheidung den Antwort-Body. Der Statuscode allein verrät nicht, ob ein erneuter Versuch sinnvoll ist.

Empfangene AntwortErneut versuchen?Zeitpunkt
error: "quota_exceeded"NeinNach reset_at, nach dem Hinzufügen von Credits oder einer Erhöhung der Schlüsselobergrenze. Dem Benutzer anzeigen, dass das Kontingent aufgebraucht ist.
error: "rate_limited", "org_overloaded", "b2b_overloaded", "limiter_unavailable"JaNach den in Retry-After angegebenen Sekunden mit zufälliger Verzögerung; höchstens einige Versuche.
error: "visitor_limit_reached"NeinSpäter; Besucher entsprechend informieren.
detail: "map_load_quota_exceeded"NeinNach Zurücksetzung des Zeitraums oder dem Kauf eines Kartenladungspakets.
error: "tile_access_restricted"NeinEmbed korrigieren: Tile-Produkt mit veröffentlichbarem Schlüssel auf einem zugelassenen Ursprung verwenden.
const RETRYABLE = new Set(['rate_limited', 'org_overloaded', 'b2b_overloaded', 'limiter_unavailable']);

async function callKaleidr(url, init, attempt = 0) {
const res = await fetch(url, init);
if (res.status !== 429) return res;

const body = await res.json().catch(() => ({}));
if (RETRYABLE.has(body.error) && attempt < 3) {
const seconds = Number(res.headers.get('retry-after')) || 5;
await new Promise((resolve) => setTimeout(resolve, (seconds + Math.random()) * 1000));
return callKaleidr(url, init, attempt + 1);
}

const error = new Error(body.error || body.detail || 'rate limited');
error.status = 429;
error.code = body.error || body.detail;
error.resetAt = body.reset_at; // present for quota_exceeded
throw error;
}

Im Browser lässt sich der Header Retry-After aus Plattform-API-Antworten per JavaScript auslesen.

Verwandte Themen​