Abundera QR Pro/ Documentation

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.

Zuletzt aktualisiert: 2026-04-18 · support@abundera.ai · OpenAPI 3.1 Spec (JSON) · Offizielle SDKs (TS / Python / Go)

Maschinenlesbare Spec:/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).

PlanLimitFenster
Business1.000 Anfragen / TagUTC-Tag
Team10.000 Anfragen / TagUTC-Tag
Agency50.000 Anfragen / TagUTC-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 }
StatusCodeBedeutung
400validation_errorBody-Feld hat Validierung nicht bestanden. Antwort enthält field + message.
401not_signed_in / invalid_api_keyFehlender, ungültiger oder widerrufener Bearer-Token.
402plan_limitDas Code-Kontingent Ihres Plans (aktiv+pausiert) ist ausgeschöpft. Antwort enthält plan, limit, current.
402plan_expiredKonto hat das 90-Tage-Gnadenfenster überschritten; Upgrade erforderlich, um fortzufahren.
403insufficient_planAPI-Zugang erfordert Business oder höher. Solo-Benutzer erhalten diesen Fehler.
403insufficient_roleIhre Team-Rolle erlaubt die angeforderte Mutation nicht (Admin+ erforderlich).
404not_foundRessource existiert nicht oder ist in Ihrem Scope nicht sichtbar.
409code_not_editableDer Code befindet sich im Gnaden- oder abgelaufenen Status; reaktivieren Sie ihn zum Bearbeiten.
429rate_limitedTägliches Budget des Plans überschritten. Siehe Rate-Limits.
500internalUnbehandelter 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 wurde
  • day_bucket, UTC-Datum (YYYY-MM-DD). Keine Sub-Tage-Präzision im zurückgegebenen Aggregat.
  • country, ISO-3166-1 alpha-2 aus dem Cloudflare-Header CF-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.