Abundera QR Pro API
REST-API-Referenz für pro.qr.abundera.ai. Dynamische QR-Codes programmatisch erstellen, bearbeiten und analysieren. Alles ist JSON über HTTPS, authentifiziert per Bearer-Token.
/docs/openapi.json, in Postman, Insomnia oder einen beliebigen OpenAPI-3.1-Client importieren. Enthält 36 kundenorientierte Endpunkte für Codes, Analytics, Groups, Teams, Webhooks und User. Admin- und Stripe-Webhook-Endpunkte sind absichtlich ausgeschlossen (nur Service-to-Service).Einführung
Die Abundera QR Pro API ermöglicht es, dynamische QR-Codes programmatisch zu erstellen, zu bearbeiten und zu analysieren, alles, was ein Entwickler aus dem Dashboard automatisieren möchte. Team-Verwaltung, Abrechnung und Kontovorgänge bleiben in der Dashboard-Oberfläche; diese API ist auf Code-Operationen für Entwickler beschränkt.
Basis-URL: https://pro.qr.abundera.ai/api
Anfrageformat: JSON (Content-Type: application/json) bei POST / PATCH / DELETE.
Antwortformat: JSON (application/json; charset=utf-8).
Verfügbarkeit: API-Zugang ist ein Business+-Feature. Solo-Pläne können das Dashboard nutzen, nicht aber die API.
Authentifizierung
Jede Anfrage trägt einen API-Schlüssel als Bearer-Token:
Authorization: Bearer abnd_qrpro_...Schlüssel erstellen und widerrufen unter /account/keys (Business-, Team- oder Agency-Tier). Der Rohwert abnd_qrpro_... wird genau einmal bei der Erstellung angezeigt, sofort speichern. Wir speichern nur den SHA-256-Hash; ein verlorener Schlüssel kann nicht wiederhergestellt werden.
Nicht authentifizierte Anfragen geben 401 { "error": "not_signed_in" } zurück. Ungültige oder widerrufene Schlüssel geben 401 { "error": "invalid_api_key" } zurück.
API-Schlüssel sind dem erstellenden Benutzer zugeordnet. Ist dieser Benutzer Mitglied eines Teams, operieren die unten aufgeführten Endpunkte automatisch auf den Codes des Teams (der aktuelle Team-Kontext wird auf dem Benutzerkonto gespeichert und über das Dashboard verwaltet).
Rate-Limits
Durchgesetzt pro API-Schlüssel. Jede Antwort enthält X-RateLimit-Limit, X-RateLimit-Remaining und X-RateLimit-Reset (Unix-Sekunden, wenn das Fenster zurückgesetzt wird).
| Plan | Limit | Fenster |
|---|---|---|
| Business | 1.000 Anfragen / Tag | UTC-Tag |
| Team | 10.000 Anfragen / Tag | UTC-Tag |
| Agency | 50.000 Anfragen / Tag | UTC-Tag |
| Solo | (403 insufficient_plan) | , |
Anfragen, die das Budget überschreiten, geben 429 { "error": "rate_limited", "window": "day", "retry_at": 1234567890 } mit einem Retry-After-Header in Sekunden zurück.
Scans unterliegen keinem Rate-Limit, der Redirect-Hotpath (aqr.net/{shortcode}) hat keine Authentifizierung und kein Scan-Budget. Jeder Plan hat ein explizites monatliches Scan-Kontingent (100k / 1M / 10M / 30M). Bei Überschreitung funktioniert die Weiterleitung weiterhin; wir benachrichtigen Sie per E-Mail, damit Sie entscheiden können, ob Sie upgraden oder einen einmaligen Spike aussitzen möchten. Planen Sie über ~10 Mio. tägliche Scans? Schreiben Sie uns, um Kapazitäten abzustimmen.
Fehler
Jede Fehlerantwort ist JSON mit einem maschinenlesbaren error-Code und ggf. zusätzlichem Kontext:
{ "error": "plan_limit", "plan": "business", "limit": 500, "current": 500 }| Status | Code | Bedeutung |
|---|---|---|
| 400 | validation_error | Body-Feld hat Validierung nicht bestanden. Antwort enthält field + message. |
| 401 | not_signed_in / invalid_api_key | Fehlender, ungültiger oder widerrufener Bearer-Token. |
| 402 | plan_limit | Das Code-Kontingent Ihres Plans (aktiv+pausiert) ist ausgeschöpft. Antwort enthält plan, limit, current. |
| 402 | plan_expired | Konto hat das 90-Tage-Gnadenfenster überschritten; Upgrade erforderlich, um fortzufahren. |
| 403 | insufficient_plan | API-Zugang erfordert Business oder höher. Solo-Benutzer erhalten diesen Fehler. |
| 403 | insufficient_role | Ihre Team-Rolle erlaubt die angeforderte Mutation nicht (Admin+ erforderlich). |
| 404 | not_found | Ressource existiert nicht oder ist in Ihrem Scope nicht sichtbar. |
| 409 | code_not_editable | Der Code befindet sich im Gnaden- oder abgelaufenen Status; reaktivieren Sie ihn zum Bearbeiten. |
| 429 | rate_limited | Tägliches Budget des Plans überschritten. Siehe Rate-Limits. |
| 500 | internal | Unbehandelter Serverfehler, bei Reproduzierbarkeit Support kontaktieren. |
Codes
Dynamische QR-Codes: ein 7-stelliger Base58-Shortcode, der über aqr.net/{shortcode} weiterleitet. Jeder Code enthält einen statischen Backup-QR, der aus dem Dashboard heruntergeladen werden kann, falls Sie jemals aufhören zu zahlen, funktioniert die statische Version weiterhin, ohne unsere Weiterleitung zu berühren.
GET /api/codes
Alle Codes in Ihrem aktuellen Scope auflisten (persönlich oder das Team, unter dem Sie gerade agieren). Gibt ein Array mit einem 30-Tage-Scan-Rollup pro Code zurück.
$ curl -H "Authorization: Bearer abnd_qrpro_..." \
https://pro.qr.abundera.ai/api/codes
{
"codes": [
{ "id": "uuid", "shortcode": "aBc123x",
"url": "https://example.com/landing",
"label": "Q2 campaign", "tags": "q2,print",
"status": "active", "scans_30d": 1245,
"created_at": 1713288000, "updated_at": 1713370000 }
],
"plan": "business",
"plan_limit": 500,
"scope": { "type": "user" }
}POST /api/codes
Neuen dynamischen Code erstellen. Das aktive+pausierte Code-Kontingent des Plans wird vor dem Einfügen geprüft. Minimaler Body:
{ "url": "https://example.com/landing" }Vollständige Anpassung (alle optional):
{ "url": "https://example.com/landing",
"label": "Spring campaign",
"tags": "q2,print",
"qr_type": "url",
"style_json": "{...}",
"logo_key": "instagram",
"frame_style": "scan-me",
"frame_text": "SCAN ME" }Gibt 201 + die erstellte Zeile zurück, einschließlich des generierten shortcode und der short_url zum Drucken.
GET /api/codes/{id}
Einzelnen Code abrufen. 404, wenn nicht in Ihrem Scope.
PATCH /api/codes/{id}
Beliebiges änderbares Feld aktualisieren. Häufigste Nutzung: Ziel-URL eines bereits gedruckten Codes ändern.
$ curl -X PATCH \
-H "Authorization: Bearer abnd_qrpro_..." \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/new-landing"}' \
https://pro.qr.abundera.ai/api/codes/uuidÄnderungen werden innerhalb von Sekunden an die Weiterleitung weitergegeben. Gültige status-Werte für PATCH: "active", "paused". Zum Löschen DELETE verwenden.
DELETE /api/codes/{id}
Soft-Delete. Übergang zu status=grace mit grace_until = now + 90 days. Die Weiterleitung funktioniert weiterhin für das gesamte Gnadenfenster, das ist das konkrete No-Lock-In-Preisversprechen. Nach 90 Tagen wird der Code expired und die Weiterleitung gibt 410 Gone zurück.
POST /api/codes/import
Massenerststellung aus einem Array-Payload (auch vom "Als Pro speichern"-Flow auf qr.abundera.ai genutzt). Akzeptiert einen einzelnen Code-Payload oder ein Array. Das Plan-Limit wird einmal vor dem Batch geprüft.
Analytics
GET /api/codes/{id}/analytics
Query-Parameter:
range=7d|30d|90d|1y|3y, auf die Aufbewahrungsdauer Ihres Plans begrenzt (Solo 1 Jahr, Business 2 Jahre, Team/Agency 3 Jahre).granularity=day|hour, stündlich nur für Team und Agency; max. 7-Tage-Fenster für stündliche Auflösung.
{
"range": "30d", "days": 30, "granularity": "day",
"total": 4321,
"timeseries": [
{ "bucket": "2026-04-01", "scans": 142 },
{ "bucket": "2026-04-02", "scans": 178 },
...
],
"by_country": [
{ "key": "US", "total": 3012 },
{ "key": "CA", "total": 402 },
{ "key": "Other", "total": 108 }
],
"by_device": [
{ "key": "mobile", "total": 3850 },
{ "key": "tablet", "total": 312 },
{ "key": "desktop", "total": 159 }
]
}Länder mit weniger als 5 Scans im Fenster werden aus Datenschutzgründen in "Other" zusammengefasst (siehe Datenschutzmodell).
API-Schlüssel
Schlüssel über die Dashboard-Seite /account/keys erstellen und widerrufen. Programmatisches Selbst-Management ist über die API schreibgeschützt, Schlüssel auflisten und widerrufen ist möglich, aber ein neuer Schlüssel erfordert das Dashboard (Henne-Ei-Problem: Sie bräuchten einen Schlüssel, um einen zu erstellen).
GET /api/keys
Ihre API-Schlüssel auflisten. Gibt niemals den Rohwert zurück, nur Metadaten.
{
"keys": [
{ "id": "uuid", "label": "Production server",
"created_at": 1713288000, "last_used_at": 1713370000 }
],
"allowed": true,
"plan": "business"
}DELETE /api/keys/{id}
Widerrufen. Der Schlüssel hört sofort auf zu funktionieren; alle nachfolgenden Anfragen damit geben 401 invalid_api_key zurück.
Datenexport
GET /api/user/export
ZIP mit vollständigem Datensatz herunterladen, codes.csv (alle Codes, einschließlich Gnaden- und abgelaufene), scans.csv (aggregiertes tägliches Rollup) und eine README.txt mit Formatbeschreibung. Das Archiv wird als application/zip gesendet; in eine Datei umleiten:
$ curl -H "Authorization: Bearer abnd_qrpro_..." \
-o abundera-qr-export.zip \
https://pro.qr.abundera.ai/api/user/exportÜberall reimportieren. Das ist die portable Format-Garantie, kein Vendor-Lock-In möglich, wenn Sie Ihre Daten besitzen.
Datenschutzmodell
Das Scan-Aggregat ist die gesamte Datenschutzgeschichte. Was wir pro Scan im Redirect-Hotpath speichern:
code_id, welcher Ihrer Codes gescannt wurdeday_bucket, UTC-Datum (YYYY-MM-DD). Keine Sub-Tage-Präzision im zurückgegebenen Aggregat.country, ISO-3166-1 alpha-2 aus dem Cloudflare-HeaderCF-IPCountry. Keine Stadt, keine Region, kein Geo-IP-Lookup.device_type,mobile/tablet/desktop/unknown, klassifiziert per kurzem User-Agent-Regex. Die Roh-UA-Zeichenkette wird nach der Klassifizierung verworfen.scan_count, Aggregatzähler, bei jedem Treffer upserted.
Was wir nicht speichern: IP-Adressen (gehasht oder anderweitig), rohe User-Agent-Strings, Geo-Daten auf Stadtebene, Sub-Tage-Zeitstempel, Referrer, Cookies, Retargeting-Pixel oder andere individuell identifizierende Vektoren. Eine Grundrauschgrenze von 5 unterdrückt Re-Identifikation bei kleinen Aggregaten.
Team- und Agency-Tiers schreiben zusätzlich ein paralleles stündliches Aggregat mit hour_bucket (YYYY-MM-DD-HH UTC). Gleiches Datenschutzmodell, keine Zeitstempel feiner als eine Stunde, gleiche Grundrauschgrenze, gleiche Abwesenheit von Daten einzelner Scanner.
Die vollständige Geschichte: /manifesto/ und /no-lock-in/ auf der Free-Tool-Website.