klick.tools aus deinem System ansprechen.
Eine Schnittstelle für die ganze Plattform — zur automatischen Erstellung und Verwaltung von QR-Codes und Kurzlinks.
Basis-URL, Anmeldung, Antwortformat
https://klick.tools/api/v1Alle Endpunkte liegen unter dieser Adresse. Es gibt keinen separaten API-Host.
Entweder per API-Schlüssel im Header Authorization: Bearer kt_live_… (alternativ x-api-key) oder — im Browser — über die bestehende Anmeldung. Ohne beides antwortet die API mit 401.
Immer JSON: Listen als { data, count }, Schreibvorgänge als { message, data }, Fehler als { error } mit passendem Statuscode. Die Links-Endpunkte liefern zusätzlich ein stabiles code-Feld, das sich maschinell auswerten lässt.
Endpunkte · QR-Codes
| Methode | Pfad | Zweck | Zugang |
|---|---|---|---|
| GET | /api/v1/qr | Alle gespeicherten QR-Codes des Kontos, inklusive Anzahl der Scans. | API-Schlüssel oder Session |
| POST | /api/v1/qr | Neuen QR-Code speichern. Antwortet mit 201 und dem angelegten Datensatz. | API-Schlüssel oder Session |
| GET | /api/v1/qr/{id} | Einzelnen Code samt der 20 jüngsten Scans. | API-Schlüssel oder Session |
| PATCH | /api/v1/qr/{id} | Titel, Inhalt oder Design eines Codes ändern. | API-Schlüssel oder Session |
| DELETE | /api/v1/qr/{id} | Code löschen. | API-Schlüssel oder Session |
| GET | /api/v1/keys | Eigene API-Schlüssel auflisten. | Nur angemeldet im Browser |
| POST | /api/v1/keys | Neuen API-Schlüssel erzeugen. Der Schlüssel beginnt mit kt_live_. | Nur angemeldet im Browser |
Endpunkte · Kurzlinks
| Methode | Pfad | Zweck | Zugang |
|---|---|---|---|
| POST | /api/v1/links | Kurzlink anlegen. Ohne Anmeldung möglich und dann rate-limitiert; customAlias erfordert PRO. Antwortet mit 201. | Optional — anonym, API-Schlüssel oder Session |
| GET | /api/v1/links | Die eigenen Kurzlinks, neueste zuerst, höchstens 200 — inklusive Klickzahl. | API-Schlüssel oder Session |
| PATCH | /api/v1/links/{id} | title und isActive für alle; targetUrl und code nur mit PRO. Beim Ändern des Codes bleibt der alte dauerhaft gesperrt. | API-Schlüssel oder Session |
| DELETE | /api/v1/links/{id} | Soft Delete: Der Kurzlink antwortet ab sofort mit 410, der Kurzcode wird nie neu vergeben. | API-Schlüssel oder Session |
| GET | /api/v1/links/{id}/stats | Free: Gesamtklicks. Pro: 30-Tage-Verlauf, verschiedene Besucher, Herkunft, Geräte, Browser, Länder. | API-Schlüssel oder Session |
Felder beim Anlegen eines QR-Codes
| Name | Typ | Beschreibung |
|---|---|---|
titlePflicht | string | Name des Codes in deiner Verwaltung. |
typePflicht | string | Inhaltstyp: url, text, wifi, vcard, email, phone oder geo. |
payloadPflicht | string | Der Inhalt, der im Code steckt — etwa die Ziel-URL oder ein fertiges WIFI:/vCard-Payload. |
designConfig | object | Farben, Modulform und Rahmen als JSON-Objekt. Wird mitgespeichert und beim Rendern im Generator wieder verwendet. |
isDynamic | boolean | true legt zusätzlich einen Kurzcode an, über den die Weiterleitung läuft — das Ziel bleibt damit später änderbar. |
Felder beim Anlegen eines Kurzlinks
| Name | Typ | Beschreibung |
|---|---|---|
targetUrlPflicht | string | Die Ziel-Adresse. Nur http:// und https://, höchstens 2.048 Zeichen. Interne und private Adressen, eingebettete Zugangsdaten und Kurzlinks dieser Seite werden abgelehnt. |
title | string | Freier Name, höchstens 160 Zeichen. Nur in der eigenen Verwaltung sichtbar. |
customAlias | string | Wunsch-Kurzcode: 3 bis 32 Zeichen aus Buchstaben, Ziffern, Bindestrich und Unterstrich. Erfordert PRO; reservierte Wörter wie admin oder api werden abgelehnt. |
Ein Aufruf, ein Datensatz
curl -X POST https://klick.tools/api/v1/qr \
-H "Authorization: Bearer $KLICK_TOOLS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Aktion Frühling",
"type": "url",
"payload": "https://example.de/aktion",
"isDynamic": true
}'const res = await fetch("https://klick.tools/api/v1/qr", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KLICK_TOOLS_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
title: "Aktion Frühling",
type: "url",
payload: "https://example.de/aktion",
}),
});
const { data } = await res.json();Kurzlink anlegen
curl -X POST https://klick.tools/api/v1/links \
-H "Content-Type: application/json" \
-d '{ "targetUrl": "https://example.de/eine/sehr/lange/adresse" }'{
"message": "Kurzlink erstellt.",
"data": {
"id": "clx7f2k9a0000xyz",
"code": "Ab3xY7z",
"shortUrl": "https://klick.tools/s/Ab3xY7z",
"targetUrl": "https://example.de/eine/sehr/lange/adresse",
"title": null,
"isActive": true,
"isCustomAlias": false,
"clickCount": 0,
"lastClickAt": null,
"createdAt": "2026-08-15T09:12:44.031Z",
"updatedAt": "2026-08-15T09:12:44.031Z",
"claimToken": "…"
}
}claimToken wird ausschließlich beim anonymen Anlegen zurückgegeben und nur dieses eine Mal. Ein Endpunkt zum Einlösen ist in Vorbereitung — bis dahin ist der Wert ohne Funktion.
Fehlercodes
| code | Status | Bedeutung |
|---|---|---|
INVALID_JSON | 400 | Der Anfrage-Körper ist kein gültiges JSON-Objekt. |
INVALID_URL | 400 | Die Ziel-Adresse hat die Prüfung nicht bestanden. |
BLOCKED_TARGET | 400 | Die Ziel-Domain steht auf der Sperrliste. |
INVALID_TITLE | 400 | Titel ist kein Text oder länger als 160 Zeichen. |
INVALID_ALIAS | 400 | Alias verletzt die Zeichen- oder Längenregel oder ist reserviert. |
SPAM_DETECTED | 400 | Das versteckte Formularfeld war ausgefüllt. |
UNAUTHORIZED | 401 | Keine gültige Session und kein gültiger API-Schlüssel. |
FORBIDDEN_ORIGIN | 403 | Der Origin-Header passt nicht zum Host (CSRF-Schutz). |
PRO_REQUIRED | 403 | Die Funktion gehört zu klick.tools PRO. |
LINK_LIMIT_REACHED | 403 | Das Kontingent des kostenlosen Tarifs ist ausgeschöpft. |
NOT_FOUND | 404 | Kein solcher Kurzlink — oder er gehört einem anderen Konto. |
ALIAS_TAKEN | 409 | Der Wunsch-Alias ist bereits vergeben. |
CODE_TAKEN | 409 | Der neue Kurzcode ist bereits vergeben. |
RATE_LIMITED | 429 | Zu viele Anfragen. Die Antwort trägt einen Retry-After-Header in Sekunden. |
QUOTA_EXCEEDED | 429 | Das monatliche API-Kontingent des Schlüssels ist ausgeschöpft. Retry-After nennt die Sekunden bis zum Monatswechsel. |
SERVER_ERROR | 500 | Unerwarteter Fehler auf unserer Seite. |
SHORT_CODE_EXHAUSTED | 503 | Es konnte kein freier Kurzcode erzeugt werden. Wiederholen. |
In Vorbereitung
Beim anonymen Anlegen entsteht ein claimToken. Ein Endpunkt, der ihn gegen die Übernahme in ein Konto eintauscht, folgt — dokumentiert wird er erst, wenn er antwortet.
Ein Aufruf, der die fertige Datei als PNG, SVG oder PDF zurückgibt, statt nur den Datensatz zu speichern. Bis dahin entsteht die Datei im Generator — mit denselben Design-Optionen.
Kontingente pro Tarif
Kurzlinks
30 Kurzlinks pro Tag, höchstens 5 in zehn Minuten und 20 pro Stunde.
25 gleichzeitig bestehende Kurzlinks. Gelöschte zählen nicht mit.
Keine Obergrenze, zusätzlich Wunsch-Alias und änderbares Ziel.
Schlüssel holen und loslegen
API-Schlüssel gehören zu einem kostenlosen Konto. Die Registrierung dauert unter einer Minute.
Kostenloses Konto anlegen