Anbindung in fünf Minuten.

Scan Gogh hat zwei programmatische Zugänge auf demselben Renderer: MCP für KI-Clients, REST für alles andere. Beide brauchen einen API-Key, den wir pro Mandant ausgeben — auf Anfrage auch für dein Projekt.

Zugang anfragen. Scan Gogh kommt bewusst ohne Selbstregistrierung: Jeden Mandanten richten wir persönlich ein — mit eigenem Kontingent, eigenen Presets und eigenem Logo. Sag uns kurz, wofür du die Schnittstelle nutzen möchtest, und wir schalten dich gerne frei. Der Key wird genau einmal angezeigt und bei uns ausschließlich als Hash gespeichert; im Klartext versenden wir ihn nie.

MCP — Claude, Claude Code, Cursor

Der Endpunkt ist https://scan-gogh.na15.io/mcp, Transport ist Streamable HTTP nach Revision 2026-07-28 (zustandslos). Ältere Clients auf der 2025er Ära werden vom selben Endpunkt mitbedient.

Claude Code, Cursor, Windsurf

claude mcp add --transport http qr \
  https://scan-gogh.na15.io/mcp \
  --header "Authorization: Bearer $NA15_QR_KEY"

Claude Desktop, claude.ai, Cowork

Als Custom Connector mit der URL https://scan-gogh.na15.io/mcp hinzufügen. Drei Einstellungen sind dabei entscheidend:

Der Key gehört damit dem Konto beziehungsweise der Organisation, die den Connector anlegt, nicht einzelnen Chats.

Werkzeuge

ToolWofürPflichtparameter
qr_generate_urlDer häufigste Fall: QR-Code für eine Webadresseurl
qr_generate_wifiWLAN-Zugang, Sonderzeichen werden korrekt maskiertssid
qr_generate_vcardKontaktkarte als vCard 3.0name
qr_generateUniversell, mit input oder fertigem contenteines von beiden
qr_validateKapazität, Kontrast und Logo/EC-Verhältnis prüfen, ohne zu rendern—
qr_list_stylesVerfügbare Stile, Paletten und Presets—

Dazu die Ressourcen qr://styles, qr://tenant/presets und qr://docs/quickstart sowie die Prompts brand-qr und print-ready.

Was zurückkommt

Jedes Ergebnis enthält dreierlei: das Bild, einen Link darauf und eine Zusammenfassung, die den Link im Klartext nennt. Das ist Absicht — nicht jede Oberfläche stellt alle drei dar. claude.ai und Claude Desktop klappen den Werkzeugaufruf samt Bild standardmäßig zu; über den Link im Antworttext kommst du trotzdem direkt an den Code.

PNG und JPEG kommen als Bild zurück; für den Bildschirm genügen 512 bis 800 Pixel. SVG ist für Druck und Weiterverarbeitung gedacht und kommt nur als Link mit einer PNG-Vorschau — SVG-Quelltext kann kein Client als Bild darstellen. Dasselbe gilt für sehr große Rasterdateien. Die Links sind signiert, verfallen nach einer Stunde und öffnen das Bild direkt im Browser; ?download=1 angehängt erzwingt stattdessen das Speichern.

Kapazität, Farbkontrast und das Verhältnis von Logogröße zu Fehlerkorrektur prüft der Server bei jedem Aufruf. Auffälligkeiten stehen als warnings im Ergebnis — der Code muss nicht nachträglich dekodiert werden, um die Scanbarkeit zu beurteilen.

REST

curl -X POST https://scan-gogh.na15.io/api/v1/qr \
  -H "Authorization: Bearer $NA15_QR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "input":  { "type": "url", "url": "https://example.de" },
        "style":  { "dotStyle": "rounded", "fg": "#1e3a8a", "bg": "#dbeafe" },
        "output": { "format": "png", "size": 1200 }
      }' \
  -o qr.png

Ohne Accept-Header kommt das Bild direkt zurück. Mit Accept: application/json antwortet derselbe Endpunkt als { data, encoding, mimeType, meta } — praktisch, wenn die Datei ohnehin weiterverarbeitet oder in ein CMS geschrieben wird.

EndpunktMethodeZweck
/api/v1/qrPOSTCode erzeugen
/api/v1/validatePOSTPrüfen ohne Rendern
/api/v1/stylesGETStilverzeichnis (ohne Key nutzbar)
/api/v1/presetsGETPresets und Logos des Mandanten
/openapi.jsonGETOpenAPI 3.1, aus denselben Schemas erzeugt
/healthzGETHealth-Check

n8n

Kein eigener Node notwendig: HTTP-Request-Node auf POST https://scan-gogh.na15.io/api/v1/qr, als Credential ein Header-Auth mit Authorization: Bearer …. Response-Format File wählen, dann landet das Bild direkt als Binary im Item. Für KI-Workflows kann alternativ der MCP-Client-Node den Endpunkt /mcp nutzen.

TYPO3

Empfohlenes Muster für die Extension na15_qr: Key aus der Umgebung lesen, beim Speichern des Inhaltselements einmal rendern, das Ergebnis als FAL-Datei ablegen und über das Cache-Framework ausliefern. So löst kein Websitebesucher je einen Request an unseren Server aus — schneller und datenschutzrechtlich sauber. Ohne konfigurierten Key sollte die Extension auf einen einfachen lokalen Renderer zurückfallen, damit sie nie hart von der API abhängt.

Parameter

FeldWerteStandard
style.dotStylesquare, dots, rounded, classy, classy-rounded, extra-roundedsquare
style.cornerStylesquare, dot, extra-roundedsquare
style.fg / style.bgHex #rrggbb#0a0a0a / #ffffff
style.gradient{ to, direction }, Richtung horizontal | diagonal-down | vertical | diagonal-upaus
style.errorCorrectionL, M, Q, HQ
style.margin0–64 Module8
logo{ dataUrl } (max. 1 MB) oder { tenantLogoId }—
logoSize0.1–0.50.3
output.formatsvg, png, jpegpng
output.size128–4096 px1200
presetName eines Mandanten- oder SystempresetsStandard-Preset des Mandanten, falls gesetzt

Ein Preset wird zuerst angewandt, explizit gesetzte style-Felder gewinnen anschließend. Erlaubte Logo-Typen sind PNG, JPEG und SVG; SVG-Logos werden serverseitig geprüft und bei Skripten, Event-Attributen oder externen Referenzen abgelehnt.

Presets legen wir pro Mandant an — sie können Farben, Punktformen und ein hinterlegtes Logo umfassen. Ist eines davon als Standard markiert, gilt es für jeden Aufruf ohne preset-Angabe: QR-Codes sitzen dann ohne einen einzigen Parameter im richtigen Corporate Design. Wer bewusst neutral rendern will, gibt preset: "default" an. Welche Presets für deinen Zugang hinterlegt sind, nennt qr_list_styles beziehungsweise GET /api/v1/styles.

Fehler und Grenzen

StatusCodeBedeutung
400invalid_inputFeld fehlt oder hat einen unerlaubten Wert
401unauthorizedKey fehlt, ist widerrufen oder abgelaufen
403insufficient_scopeDer Key hat den benötigten Scope nicht
404preset_unknownPreset oder Tenant-Logo existiert nicht
413logo_too_largeLogo über 1 MB
422content_too_longInhalt passt bei diesem EC-Level in keinen QR-Code
429rate_limited / quota_exceededRate-Limit oder Monatskontingent erreicht, siehe Retry-After

Standardgrenzen pro Mandant: 60 Anfragen pro Minute, 5.000 pro Monat, maximal 4096 px Ausgabegröße, 5 Sekunden pro Rendering. Antworten tragen X-Qr-Version, X-Qr-Modules, X-Qr-Contrast und, falls vorhanden, X-Qr-Warnings.

Warnungen ernst nehmen. Ein Code mit zu großem Logo oder zu wenig Kontrast wird trotzdem erzeugt — er ist dann aber schlecht oder nicht scanbar. qr_validate bzw. /api/v1/validate sagt vorher, was zu erwarten ist.

Kontakt

Du brauchst einen Zugang, ein größeres Kontingent oder Unterstützung bei der Anbindung an TYPO3, n8n oder einen KI-Client? Melde dich bei der nullacht15 GmbH. Wir richten den Mandanten ein, hinterlegen Presets und Logo und begleiten die Integration.