REST API · v1
API-Dokumentation
Alle Endpunkte, alle Parameter, alle Antwortformate. Kein SDK notwendig.
Einstieg
Die kürze.at REST-API ermöglicht das programmatische Erstellen und Verwalten von Kurzlinks und QR-Codes. Sie ist verfügbar ab dem Pro-Tarif.
- Melden Sie sich an und navigieren Sie zu Dashboard → Einstellungen → API-Schlüssel
- Erstellen Sie einen neuen API-Schlüssel mit den gewünschten Berechtigungen
- Senden Sie den Schlüssel als Bearer-Token im
Authorization-Header
Authentifizierung
Alle Requests müssen einen gültigen Bearer-Token im Header enthalten:
Authorization: Bearer kuerze_YOUR_API_TOKEN
Basis-URL
https://kuerze.at/api/v1
Alle Endpunkte sind relativ zu dieser Basis-URL. HTTPS wird erzwungen.
Rate Limiting
| Tarif | Limit | Header |
|---|---|---|
| Pro | 10.000 Requests/Tag | X-RateLimit-Remaining |
| Agentur | Unbegrenzt | – |
Bei Überschreitung wird HTTP 429 Too Many Requests zurückgegeben. Der Header Retry-After gibt an, wann das Limit zurückgesetzt wird.
Fehlerformate
Alle Fehler werden als JSON zurückgegeben:
{
"message": "The destination_url field is required.",
"errors": {
"destination_url": ["The destination_url field is required."]
}
}
400
Bad Request
401
Unauthorized
403
Forbidden
404
Not Found
422
Validation Error
429
Rate Limit
500
Server Error
204
No Content
Links
Kurzlinks erstellen, abrufen, aktualisieren und löschen.
/api/v1/links
Links auflisten
Gibt eine paginierte Liste aller Links des authentifizierten Teams zurück.
Parameter
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| search | string | nein | Freitext-Suche in Titel, Slug und Ziel-URL |
| status | string | nein | Filter: active | inactive | archived |
| type | string | nein | Filter: dynamic | static |
| per_page | integer | nein | Einträge pro Seite (Standard: 25, Max: 100) |
| page | integer | nein | Seitennummer |
Antwort 200
{"data": [{
"id": 42,
"ulid": "01HN...",
"short_code": "sommer25",
"short_url": "https://kuerze.at/sommer25",
"destination_url": "https://example.at/sommerkampagne",
"title": "Sommerkampagne 2025",
"type": "dynamic",
"status": "active",
"click_count": 1247,
"unique_click_count": 891,
"expires_at": null,
"created_at": "2026-01-15T10:23:00Z",
"updated_at": "2026-04-20T08:11:00Z"
}], "meta": {"total": 24, "per_page": 25, "current_page": 1}}
/api/v1/links
Link erstellen
Erstellt einen neuen Kurzlink.
Parameter
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| destination_url | string | ja | Ziel-URL (muss mit https:// beginnen) |
| title | string | nein | Interner Titel |
| custom_short_code | string | nein | Eigener Slug (4–32 Zeichen, A-Z 0-9 _ -) |
| type | string | nein | dynamic (Standard) | static |
| domain_id | integer | nein | ID einer verifizierten Custom Domain |
| project_id | integer | nein | Projekt-ID |
| expires_at | string | nein | Ablaufdatum (ISO 8601) |
| click_limit | integer | nein | Maximale Klickanzahl |
| utm_params | object | nein | {source, medium, campaign, term, content} |
| password | string | nein | Passwortschutz |
Request Body
{
"destination_url": "https://example.at/sommerkampagne",
"title": "Sommerkampagne 2025",
"custom_short_code": "sommer25",
"utm_params": {
"source": "newsletter",
"campaign": "sommer25"
}
}
Antwort 201
{
"id": 42,
"ulid": "01HN...",
"short_code": "sommer25",
"short_url": "https://kuerze.at/sommer25",
"destination_url": "https://example.at/sommerkampagne",
"title": "Sommerkampagne 2025",
"type": "dynamic",
"status": "active",
"click_count": 1247,
"unique_click_count": 891,
"expires_at": null,
"created_at": "2026-01-15T10:23:00Z",
"updated_at": "2026-04-20T08:11:00Z"
}
/api/v1/links/{id}
Link abrufen
Gibt einen einzelnen Link zurück.
Antwort 200
{
"id": 42,
"ulid": "01HN...",
"short_code": "sommer25",
"short_url": "https://kuerze.at/sommer25",
"destination_url": "https://example.at/sommerkampagne",
"title": "Sommerkampagne 2025",
"type": "dynamic",
"status": "active",
"click_count": 1247,
"unique_click_count": 891,
"expires_at": null,
"created_at": "2026-01-15T10:23:00Z",
"updated_at": "2026-04-20T08:11:00Z"
}
/api/v1/links/{id}
Link aktualisieren
Aktualisiert einen bestehenden Link. Nur übergebene Felder werden geändert.
Parameter
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| destination_url | string | nein | Neue Ziel-URL |
| title | string | nein | Neuer Titel |
| expires_at | string | nein | Neues Ablaufdatum (null = entfernen) |
| utm_params | object | nein | UTM-Parameter überschreiben |
Request Body
{
"destination_url": "https://example.at/neue-zielseite",
"title": "Aktualisierter Titel"
}
Antwort 200
{
"id": 42,
"ulid": "01HN...",
"short_code": "sommer25",
"short_url": "https://kuerze.at/sommer25",
"destination_url": "https://example.at/sommerkampagne",
"title": "Sommerkampagne 2025",
"type": "dynamic",
"status": "active",
"click_count": 1247,
"unique_click_count": 891,
"expires_at": null,
"created_at": "2026-01-15T10:23:00Z",
"updated_at": "2026-04-20T08:11:00Z"
}
/api/v1/links/{id}
Link löschen
Löscht einen Link endgültig. Statistiken bleiben anonymisiert erhalten.
Antwort 204
Kein Body
/api/v1/links/{id}/toggle
Link aktivieren/deaktivieren
Wechselt den Status zwischen active und inactive.
Antwort 200
{"status": "inactive"}
QR-Codes
QR-Codes erstellen und verwalten.
/api/v1/qr-codes
QR-Codes auflisten
Gibt eine paginierte Liste aller QR-Codes des Teams zurück.
Parameter
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| search | string | nein | Suche im Namen |
| type | string | nein | Filter nach QR-Typ (url, wifi, vcard, …) |
| per_page | integer | nein | Einträge pro Seite (Standard: 25) |
Antwort 200
{"data": [{
"id": 7,
"ulid": "01HN...",
"name": "Mängelmelder QR",
"type": "url",
"content": {"url": "https://buergerservice.example.at/meldung"},
"output_format": "svg",
"scan_count": 892,
"created_at": "2026-01-20T09:00:00Z"
}], "meta": {"total": 12}}
/api/v1/qr-codes
QR-Code erstellen
Erstellt einen neuen QR-Code. Der Code wird asynchron generiert.
Parameter
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| name | string | ja | Interner Name |
| type | string | ja | url | wifi | vcard | email | phone | sms | location | event | epc_girocode |
| content | object | ja | Inhalt abhängig vom Typ (siehe unten) |
| output_format | string | nein | svg (Standard) | png |
| error_correction | string | nein | L | M (Standard) | Q | H |
| size | integer | nein | Pixel (100–2000, Standard: 400) |
| design | object | nein | {foreground_color, background_color} |
| project_id | integer | nein | Projekt-ID |
Request Body
{
"name": "Mängelmelder QR",
"type": "url",
"content": {
"url": "https://buergerservice.example.at/meldung"
},
"output_format": "svg",
"error_correction": "H",
"design": {
"foreground_color": "#0A0908",
"background_color": "#FFFFFF"
}
}
Antwort 201
{
"id": 7,
"ulid": "01HN...",
"name": "Mängelmelder QR",
"type": "url",
"content": {"url": "https://buergerservice.example.at/meldung"},
"output_format": "svg",
"scan_count": 892,
"created_at": "2026-01-20T09:00:00Z"
}
Content-Objekte nach QR-Typ
/api/v1/qr-codes/{id}
QR-Code abrufen
Gibt einen einzelnen QR-Code zurück.
Antwort 200
{
"id": 7,
"ulid": "01HN...",
"name": "Mängelmelder QR",
"type": "url",
"content": {"url": "https://buergerservice.example.at/meldung"},
"output_format": "svg",
"scan_count": 892,
"created_at": "2026-01-20T09:00:00Z"
}
/api/v1/qr-codes/{id}
QR-Code löschen
Löscht einen QR-Code endgültig.
Antwort 204
Kein Body
Analytics
Anonymisierte Klick-Statistiken abrufen.
/api/v1/analytics/overview
Übersicht
Gesamt-Statistiken des Teams für einen Zeitraum.
Parameter
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| days | integer | nein | Zeitraum in Tagen (Standard: 30, Max: 365) |
Antwort 200
{
"total_clicks": 8471,
"unique_clicks": 6203,
"bot_clicks": 142,
"total_scans": 2103,
"period_days": 30
}
/api/v1/analytics/links/{id}
Link-Statistiken
Detaillierte Statistiken für einen einzelnen Link.
Parameter
| Name | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| days | integer | nein | Zeitraum in Tagen (Standard: 30) |
Antwort 200
{
"clicks": 1247,
"unique_clicks": 891,
"chart": [
{"date": "2026-04-01", "clicks": 42, "unique": 31},
...
],
"countries": {"AT": 847, "DE": 312, "CH": 88},
"devices": {"mobile": 712, "desktop": 401, "tablet": 134}
}