{"openapi":"3.1.0","info":{"title":"Scan Gogh API","version":"2.0.0","description":"QR-Codes in Scan-Gogh-Qualität programmatisch erzeugen. Inhalte werden nur im Speicher verarbeitet und nicht gespeichert.","contact":{"name":"nullacht15 GmbH","url":"https://www.nullacht15.com"}},"servers":[{"url":"https://scan-gogh.na15.io"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API-Key im Format na15_qr_live_…"}},"schemas":{"QrRequest":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"url"},"url":{"type":"string","maxLength":2000,"format":"uri"}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","const":"text"},"text":{"type":"string","minLength":1,"maxLength":2000}},"required":["type","text"]},{"type":"object","properties":{"type":{"type":"string","const":"wifi"},"ssid":{"type":"string","minLength":1,"maxLength":32},"password":{"default":"","type":"string","maxLength":63},"encryption":{"default":"WPA","type":"string","enum":["WPA","WEP","nopass"]},"hidden":{"default":false,"type":"boolean"}},"required":["type","ssid"]},{"type":"object","properties":{"type":{"type":"string","const":"vcard"},"name":{"type":"string","minLength":1,"maxLength":120},"phone":{"type":"string","maxLength":40},"email":{"type":"string","maxLength":160,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"org":{"type":"string","maxLength":120},"title":{"type":"string","maxLength":120},"url":{"type":"string","maxLength":400,"format":"uri"}},"required":["type","name"]}]},"content":{"type":"string","minLength":1,"maxLength":2953},"style":{"default":{},"type":"object","properties":{"dotStyle":{"default":"square","type":"string","enum":["square","dots","rounded","classy","classy-rounded","extra-rounded"]},"cornerStyle":{"default":"square","type":"string","enum":["square","dot","extra-rounded"]},"fg":{"default":"#0a0a0a","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"bg":{"default":"#ffffff","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"gradient":{"type":"object","properties":{"to":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"direction":{"default":"horizontal","type":"string","enum":["horizontal","diagonal-down","vertical","diagonal-up"]}},"required":["to"]},"errorCorrection":{"default":"Q","type":"string","enum":["L","M","Q","H"]},"margin":{"default":8,"type":"integer","minimum":0,"maximum":64}}},"preset":{"type":"string","maxLength":64},"logo":{"anyOf":[{"type":"object","properties":{"dataUrl":{"type":"string","maxLength":1400000}},"required":["dataUrl"]},{"type":"object","properties":{"tenantLogoId":{"type":"string","maxLength":64}},"required":["tenantLogoId"]}]},"logoSize":{"default":0.3,"type":"number","minimum":0.1,"maximum":0.5},"logoBackground":{"default":true,"type":"boolean"},"output":{"default":{},"type":"object","properties":{"format":{"default":"png","type":"string","enum":["svg","png","jpeg"]},"size":{"default":1200,"type":"integer","minimum":128,"maximum":4096}}}}},"Style":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"dotStyle":{"default":"square","type":"string","enum":["square","dots","rounded","classy","classy-rounded","extra-rounded"]},"cornerStyle":{"default":"square","type":"string","enum":["square","dot","extra-rounded"]},"fg":{"default":"#0a0a0a","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"bg":{"default":"#ffffff","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"gradient":{"type":"object","properties":{"to":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"direction":{"default":"horizontal","type":"string","enum":["horizontal","diagonal-down","vertical","diagonal-up"]}},"required":["to"]},"errorCorrection":{"default":"Q","type":"string","enum":["L","M","Q","H"]},"margin":{"default":8,"type":"integer","minimum":0,"maximum":64}}},"Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"format":{"default":"png","type":"string","enum":["svg","png","jpeg"]},"size":{"default":1200,"type":"integer","minimum":128,"maximum":4096}}}}},"security":[{"bearerAuth":[]}],"paths":{"/api/v1/qr":{"post":{"summary":"QR-Code erzeugen","description":"Liefert das Bild direkt (Content-Type nach Format) oder, mit `Accept: application/json`, ein JSON-Objekt mit Daten und Metadaten.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QrRequest"}}}},"responses":{"200":{"description":"Erzeugter Code","content":{"image/svg+xml":{"schema":{"type":"string"}},"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string"},"encoding":{"type":"string","enum":["utf8","base64"]},"mimeType":{"type":"string"},"meta":{"type":"object"}}}}}},"400":{"description":"Eingabe ungültig"},"401":{"description":"API-Key fehlt oder ist ungültig"},"422":{"description":"Inhalt passt nicht in einen QR-Code"},"429":{"description":"Rate-Limit oder Monatskontingent erreicht"}}}},"/api/v1/validate":{"post":{"summary":"Prüfen ohne Rendern","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QrRequest"}}}},"responses":{"200":{"description":"Kapazität, Kontrast und Warnungen"}}}},"/api/v1/styles":{"get":{"summary":"Verfügbare Stile und Paletten","security":[],"responses":{"200":{"description":"Stilverzeichnis"}}}},"/api/v1/presets":{"get":{"summary":"Presets und Logos des Mandanten","responses":{"200":{"description":"Presets"}}}},"/api/healthz":{"get":{"summary":"Health-Check","security":[],"responses":{"200":{"description":"ok"}}}}},"x-enums":{"dotStyle":["square","dots","rounded","classy","classy-rounded","extra-rounded"],"cornerStyle":["square","dot","extra-rounded"],"gradientDirection":["horizontal","diagonal-down","vertical","diagonal-up"],"errorCorrection":["L","M","Q","H"],"outputFormat":["svg","png","jpeg"]}}