Enqre

QR-Code-API

Codes aus dem eigenen Backend erstellen, ihre Scans auslesen und in dem Moment einen Webhook bekommen, in dem jemand scannt. Diese Seite braucht kein Konto.

Die API gehört zum Business-Tarif. Schlüssel werden im Dashboard unter „API & Webhooks“ erstellt und einmalig angezeigt — ein verlorener Schlüssel wird widerrufen und ersetzt, nie wiederhergestellt.

Basis-URL

https://enqre.com/api/v1

Authentifizierung

Jede Anfrage trägt den Schlüssel als Bearer-Token. Ohne gültigen Schlüssel: 401. Gültiger Schlüssel in einem Tarif ohne API: 403.

curl https://enqre.com/api/v1/qrcodes \
  -H "Authorization: Bearer $ENQRE_API_KEY"

Endpunkte

GET/api/v1/qrcodes?limit=50&cursor=<id>

Ihre Codes auflisten, neueste zuerst. Cursor-Paginierung: den zurückgegebenen nextCursor für die nächste Seite mitgeben.

{
  "data": [
    {
      "id": "clx…", "name": "Table tent", "type": "URL",
      "slug": "a1b2c3", "destinationUrl": "https://example.com/menu",
      "scanCount": 128, "active": true, "createdAt": "2026-09-01T10:00:00.000Z",
      "shortUrl": "https://enqre.com/r/a1b2c3"
    }
  ],
  "nextCursor": "clx…"
}

POST/api/v1/qrcodes

Einen dynamischen URL-Code erstellen. Die Antwort enthält die kurze URL zum Drucken.

{ "name": "Table tent", "url": "https://example.com/menu" }
201 Created
{
  "data": {
    "id": "clx…", "name": "Table tent", "slug": "a1b2c3",
    "destinationUrl": "https://example.com/menu",
    "shortUrl": "https://enqre.com/r/a1b2c3"
  }
}

GET/api/v1/qrcodes/{id}

Einen Code lesen.

PATCH/api/v1/qrcodes/{id}

Einen Code ändern — auch sein Ziel. Genau dafür ist ein dynamischer Code da: Das gedruckte Exemplar funktioniert weiter und zeigt woandershin.

{ "url": "https://example.com/autumn-menu", "name": "Autumn menu", "active": true }

DELETE/api/v1/qrcodes/{id}

Einen Code löschen. Gedruckte Exemplare lösen dann nicht mehr auf — zum Pausieren einer Kampagne stattdessen active auf false setzen.

GET/api/v1/qrcodes/{id}/scans

Die letzten 1.000 Scans eines Codes, neueste zuerst, plus die Gesamtzahl.

{
  "total": 128,
  "data": [
    { "createdAt": "2026-09-06T18:12:03.000Z", "device": "mobile", "os": "iOS", "browser": "Safari" }
  ]
}

Fehler

Fehler kommen als JSON mit einem stabilen maschinenlesbaren Code. Verzweigen Sie über den Code, nicht über die Meldung — Meldungen können umformuliert werden, Codes nicht.

401invalid_api_keyNo key, a revoked key, or one that does not exist.
403api_not_available_on_planThe key is valid; the account is not on Business.
400invalid_bodyThe JSON body failed validation.
402plan_limit_reachedThe account is at its dynamic-code limit.
404not_foundNo code with that id on this account.
429rate_limitedMore than 60 writes in a minute.

Ratenbegrenzung

60 Schreibvorgänge pro Minute und Konto, darüber 429. Lesevorgänge sind derzeit nicht begrenzt; darauf sollte man nicht bauen.

Webhooks

Eine URL unter „API & Webhooks“ hinterlegen, und jeder Scan wird sofort dorthin gesendet — Ihr System erfährt davon, ohne zu pollen.

POST your-endpoint
X-Enqre-Event: scan.created
X-Enqre-Signature: <hex hmac-sha256 of the raw body>
Content-Type: application/json

{
  "event": "scan.created",
  "qrCodeId": "clx…",
  "slug": "a1b2c3",
  "name": "Table tent",
  "device": "mobile",
  "os": "iOS",
  "browser": "Safari"
}

Signatur prüfen

HMAC-SHA256 des rohen Request-Body mit Ihrem Webhook-Secret berechnen und mit dem Header vergleichen. Was nicht passt, ablehnen — und in konstanter Zeit vergleichen.

import crypto from "node:crypto";

const raw = await req.text(); // the raw body, before JSON.parse
const expected = crypto
  .createHmac("sha256", process.env.ENQRE_WEBHOOK_SECRET)
  .update(raw)
  .digest("hex");

const given = req.headers.get("x-enqre-signature") ?? "";
const ok =
  given.length === expected.length &&
  crypto.timingSafeEqual(Buffer.from(given), Buffer.from(expected));

Postman-Collection

Alle Endpunkte dieser Seite, sofort ausführbar: Collection importieren, Variable apiKey setzen, senden.

Collection herunterladen

Was die API noch nicht kann

Über die API erstellte Codes sind URL-Codes im Standard-Design. Die anderen sechzehn Typen, die Design-Felder und der Bulk-Import laufen vorerst nur im Dashboard. Was die API erstellt, ist ein ganz normaler Code: änderbar, messbar und druckbar wie jeder andere.

Schlüssel holen

API, Webhooks, GS1 Digital Link, White-Label und eigene Domain sind im Business-Tarif, 39 € im Monat.

Tarife ansehen