Developers

Alles über die API — auch skriptbar

Codes anlegen, Ziele aktualisieren, Statistiken und Monitoring-Status abfragen — alles, was das Dashboard kann, kann auch Ihre eigene Anwendung. Verfügbar ab dem Professional-Tarif.

Authentifizierung

Bearer-Token

Jede Anfrage wird per Authorization: Bearer-Header authentifiziert. API-Schlüssel legen Sie unter Integrationen in Ihrem Konto an (nyqra.de/app/integrationen) — der volle Schlüssel wird nur einmal direkt nach dem Anlegen angezeigt.

curl https://nyqra.de/api/qr-codes \
  -H "Authorization: Bearer nyqra_live_ihr_schluessel"
Ziel aktualisieren

Der Kernfall: PUT auf einen bestehenden Code

curl -X PUT https://nyqra.de/api/qr-codes/123 \
  -H "Authorization: Bearer nyqra_live_ihr_schluessel" \
  -H "Content-Type: application/json" \
  -d '{
    "target_url": "https://ihre-seite.de/sommer-2026"
  }'
Beispiel in JavaScript
await fetch("https://nyqra.de/api/qr-codes/123", {
  method: "PUT",
  headers: {
    "Authorization": `Bearer ${process.env.NYQRA_API_KEY}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({ target_url: "https://ihre-seite.de/sommer-2026" })
});

Die Code-ID (hier 123) ist die numerische ID aus der Antwort von GET /api/qr-codes bzw. POST /api/qr-codes — nicht der sechsstellige Kurzcode selbst.

Endpunkte (Überblick)

Für API-Schlüssel geöffnete Endpunkte

Nur diese Routen akzeptieren einen API-Schlüssel. Benutzerverwaltung, Teams, Einladungen und Organisationseinstellungen bleiben bewusst ausschließlich per Login erreichbar.

MethodePfadZweckScope
GET/api/qr-codesAlle Codes auflistenqr_codes:read
POST/api/qr-codesNeuen Code anlegenqr_codes:write
GET/api/qr-codes/{id}Einzelnen Code abrufenqr_codes:read
PUT/api/qr-codes/{id}Ziel, Titel oder Status ändernqr_codes:write
GET/api/qr-codes/{id}/historyVersionshistorie abrufenversions:read
GET/api/qr-codes/{id}/healthAktuellen Monitoring-Status abrufenmonitoring:read
POST/api/qr-codes/{id}/check-nowSofortige Zielprüfung anstoßenmonitoring:check
GET/api/qr-codes/{id}/analyticsScan-Statistiken zu einem Codeanalytics:read
GET/api/analytics/*Aggregierte Scan-Statistikenanalytics:read
GET/api/organizationOrganisationsstammdaten lesendorganization:read

Ein Schlüssel erhält beim Anlegen genau die Scopes, die die erstellende Rolle selbst besitzt — keine Rechte-Eskalation möglich. Nur Owner und Admin dürfen API-Schlüssel und Webhooks verwalten.

Rate-Limits

Damit ein Skript nie das Dashboard ausbremst

EbeneLesend (GET)Schreibend
pro API-Schlüssel300 / Minute60 / Minute
pro Organisation (alle Schlüssel zusammen)1.000 / Minute200 / Minute

Bei Überschreitung: HTTP 429 mit Retry-After-Header.

Webhooks

Live benachrichtigt werden

Abonnieren Sie reale Ereignisse aus Ihrem QR-Code-Bestand, statt regelmäßig abzufragen — jede Zustellung ist per HMAC-SHA256 signiert.

EreignisAuslöser
qr_code.createdNeuer Code angelegt
qr_code.updatedCode geändert (nur bei echter Änderung)
qr_code.deletedCode archiviert/gelöscht
qr_code.rolled_backAuf eine frühere Version zurückgesetzt
redirect_rule.createdNeue Smart-Redirect-Regel
redirect_rule.updatedSmart-Redirect-Regel geändert
monitoring.healthyZiel wieder erreichbar (ohne vorherigen Ausfall)
monitoring.warningZiel liefert eine Warnung (z. B. langsame Antwort)
monitoring.offlineZiel nicht erreichbar
monitoring.recoveredZiel nach einem Ausfall wieder erreichbar
api_key.revokedEin API-Schlüssel wurde widerrufen

analytics.threshold_reached ist beim Anlegen eines Webhooks bereits auswählbar, wird aber aktuell von keinem Schwellenwert-Mechanismus ausgelöst — es gibt bislang kein Alarmmodell für Scan-Zahlen. Ehrlich vorbereitet, aber noch ungenutzt.

Payload-Format
{
  "event_id": "8b6e...-uuid",
  "event_type": "qr_code.created",
  "created_at": "2026-07-28T12:00:00.000Z",
  "tenant_id": "5c2f...-uuid",
  "resource_type": "qr_code",
  "resource_id": "123",
  "api_version": "2026-01-01",
  "data": { "code": "A1B2C3", "title": "…", "target_url": "…" }
}
Signatur prüfen (Node.js)
const crypto = require("crypto");

function isValidNyqraWebhook(secret, rawBody, timestamp, signatureHeader) {
  const ageSeconds = Math.abs(Math.floor(Date.now() / 1000) - Number(timestamp));
  if (ageSeconds > 300) return false; // Replay-Schutz: 5 Minuten Toleranz

  const expected = crypto.createHmac("sha256", secret)
    .update(`${timestamp}.${rawBody}`).digest("hex");
  const provided = signatureHeader.replace("sha256=", "");
  const a = Buffer.from(expected, "hex");
  const b = Buffer.from(provided, "hex");
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}

// Header: X-NYQRA-Signature ("sha256=…"), X-NYQRA-Timestamp, X-NYQRA-Event-Id

Nach 5 erfolglosen Zustellversuchen (sofort, nach 1 Min., 5 Min., 30 Min., 2 Std.) wird der Webhook automatisch deaktiviert, nicht gelöscht — reaktivieren Sie ihn nach Behebung der Störung manuell.

SDKs

Aktuell reines REST

Es gibt derzeit keine offiziellen Client-Bibliotheken — die API ist über jeden HTTP-Client nutzbar (curl, fetch, Postman, …). Ehrlich gesagt, statt einen Fahrplan zu versprechen, den es noch nicht gibt.

Vollständige Referenz in der Dokumentation

Pilotzugang anfragen

Ihre Angaben werden ausschließlich zur Bearbeitung dieser Kontaktanfrage verwendet, keine Marketinganmeldung, keine Weitergabe an externe Formulardienste. Details: Datenschutzerklärung (vorläufig).

Live-Demo anfragen

Ihre Angaben werden ausschließlich zur Bearbeitung dieser Kontaktanfrage verwendet, keine Marketinganmeldung, keine Weitergabe an externe Formulardienste. Details: Datenschutzerklärung (vorläufig).

Pilotpartner werden

Ihre Angaben werden ausschließlich zur Bearbeitung dieser Kontaktanfrage verwendet, keine Marketinganmeldung, keine Weitergabe an externe Formulardienste. Details: Datenschutzerklärung (vorläufig).

Kontakt aufnehmen

Ihre Angaben werden ausschließlich zur Bearbeitung dieser Kontaktanfrage verwendet, keine Marketinganmeldung, keine Weitergabe an externe Formulardienste. Details: Datenschutzerklärung (vorläufig).