PROFI
DokuDie API
Kilo ist API-first: Das Dashboard, in das du dich einloggst, ist ein Client derselben HTTP-API, die du selbst aufrufen kannst. Alles, was du per Klick tun kannst - einen Link erstellen, seine Statistiken lesen, eine Routing-Regel hinzufügen - ist eine Anfrage mit einem Schlüssel. Diese Seite behandelt die Basis-URL, wie man sich authentifiziert, die zwei Scopes, die Fehlerform und Ratenlimits.
Basis-URL
Die API wird von demselben Cloudflare Worker bedient, der deine Links auflöst, auf dem Kilo-QR-Origin. Heute heißt das, Anfragen gehen an qr2r.com unter dem /api-Präfix:
https://qr2r.com/apiJeder Pfad in diesen Anleitungen ist relativ zu dieser Basis - /links bedeutet https://qr2r.com/api/links. Ein schneller Weg, zu bestätigen, dass ein Schlüssel funktioniert, ist die API-Wurzel, die deine Identität zurückspiegelt:
{ "api": "qr2r", "version": 0, "user": { "uid": 42, "email": "", "admin": false } }Ein stabiler Hostname kommt
Die API teilt sich den Origin, auf dem deine Links auflösen, weil dieser Worker die Plattform ist. Ein eigener api.qr2r.com-Hostname wird für das Launch-Fenster verdrahtet; bis er live geht, richte Clients auf denselben Origin oben. Die Pfade und Payloads ändern sich nicht, wenn sich der Hostname ändert.
Mit einem API-Schlüssel authentifizieren
Sende deinen Schlüssel als Bearer-Token im Authorization-Header. Der Schlüssel wird vor dem Sitzungscookie geprüft, sodass ein API-Client in einem Auth-Modus bleibt, ohne dass ein veraltetes Browser-Cookie hereinsickert.
Authorization: Bearer qr2r_live_1a2b3c…Schlüssel beginnen mit qr2r_live_ (oder qr2r_test_ für einen Dev-Modus-Schlüssel). Dieses qr2r_-Präfix ist ein Infrastruktur-Bezeichner, der bewusst nicht umbenannt wurde - derselbe Grund, aus dem die Domain noch qr2r.com ist. Du erzeugst einen Schlüssel im Dashboard unter API keys; der volle Token wird bei der Erstellung einmal angezeigt, und Kilo speichert nur seinen SHA-256-Hash, also leg ihn direkt in einen Secret-Manager. Eine Anfrage ohne gültigen Schlüssel (und ohne Sitzung) wird abgelehnt:
{ "error": "unauthorized" }Schlüssel werden interaktiv erzeugt
Schlüssel erstellen, auflisten und widerrufen ist eine reine Sitzungsaktion - ein Bearer-Schlüssel kann keinen anderen Schlüssel erzeugen oder widerrufen, sodass ein geleakter Token nicht still eine eigene Flotte bereitstellen kann. Verwalte Schlüssel aus dem Dashboard. Ein Konto darf bis zu 10 aktive Schlüssel gleichzeitig halten.
API-Zugriff ist eine Funktion kostenpflichtiger Tarife. Ein Schlüssel auf einem Tarif ohne sie wird mit 402 und { "error": "plan_required", "feature": "api_access" } abgelehnt.
Scopes: Lesen und Schreiben
Ein Schlüssel trägt einen oder beide von zwei Scopes. Ein Lese-Schlüssel darf nur sichere Methoden aufrufen - GET, HEAD, OPTIONS. Ein Schreib-Schlüssel darf zusätzlich POST, PUT, PATCH und DELETE. Ein Schreibversuch mit einem reinen Lese-Schlüssel wird abgelehnt:
{ "error": "insufficient_scope", "required": "write" }Scopes sind die ganze Berechtigungsgeschichte eines Schlüssels: Ein Schlüssel kann Links, Regeln verwalten und Analysen lesen, aber er kann nie Mitglieder, Abrechnung oder andere Schlüssel verwalten - diese Aktionen bleiben an eine interaktive Sitzung gebunden. Gib einer Integration einen Lese-Schlüssel, wenn sie nur Zahlen abruft.
Fehler sind immer JSON
Jede Fehlerantwort ist ein JSON-Objekt mit einem error-String, plus Zusatzfeldern, wo sie helfen. Validierungsfehler tragen die vollständige Problemliste unter issues:
{ "error": "invalid_body", "issues": [ /* zod issues */ ] }Die Codes, denen du am häufigsten begegnest:
400 invalid_body- der Anfragekörper hat die Validierung nicht bestanden.401 unauthorized- fehlender oder ungültiger Schlüssel.402 plan_required- die Funktion braucht einen höheren Tarif (trägtfeature).403 insufficient_scope/forbidden- der Schlüssel kann diese Methode oder Aktion nicht ausführen.404 not_found- kein solcher Link, keine solche Regel oder Domain in deinem Arbeitsbereich.409- ein Konflikt, etwaname_takenodercap_reached.422 destination_unsafe- das Ziel hat die Sicherheitsprüfung nicht bestanden.429 rate_limited- zu viele Anfragen (siehe unten).
Ratenlimits
Authentifizierte Anfragen werden ratenbegrenzt. Der allgemeine Bucket erlaubt 60 Anfragen pro Minute pro Nutzer. Zusätzlich bekommt ein API-Schlüssel seine eigene Obergrenze pro Schlüssel und pro Minute, genommen aus dem api_rpm-Limit deines Tarifs. Überschreite eines, und die Antwort ist:
{ "error": "rate_limited", "retry_after": 42 }Der retry_after-Wert (auch als Retry-After-Header gesendet) ist die Zahl der Sekunden, bis sich das Fenster zurücksetzt. Warte so lange und versuche es erneut.
Ehrlich zum aktuellen Begrenzer
Der Begrenzer läuft heute an jedem Cloudflare-Edge-Standort unabhängig, sodass die Zahlen pro Minute eher ein Boden als ein harter globaler Vertrag sind; ein dauerhafter, standortübergreifender Begrenzer kommt zusammen mit dem kostenpflichtigen Tarif. Baue deinen Client so, dass er 429 und Retry-After respektiert, und er läuft unverändert weiter, wenn dieser Schalter umgelegt wird.
Mit einem Schlüssel in der Hand führt die nächste Anleitung durch die Link-Endpoints, einen Aufruf nach dem anderen.
Deine API-Schlüssel verwalten