QR-Code-API
Der QR-Code für Ihre Rechnungen, mit einem Aufruf.
Text oder Link senden und nur das Bild des QR-Codes erhalten, als PNG oder SVG, bereit für Ihre Rechnung, Ihren Beleg oder Ihr Etikett. Ein Code pro Aufruf, nichts wird gespeichert.
Kostenlos · 1.000 Codes pro Monat · SVG oder PNG
In drei Schritten bereit.
Ohne Karte, ohne Installation.
- Mit Google anmelden1
Mit Google anmelden
Kostenlos, ohne Karte, ohne Installation.
- Ihr Schlüssel · einmal gezeigtqs_live_7hK2…Kopieren2
Schlüssel erstellen
Ein Klick im Tab Entwickler Ihres Profils. Wir behalten nur einen Fingerabdruck.
- POST3
Aufrufen und das Bild verwenden
Sie erhalten nur das Bild des Codes und wie viele Ihnen bleiben. Das Dokument bleibt Ihres.
Erst sehen, dann programmieren.
Wählen Sie und sehen Sie den Code auf einem Beispieldokument in echter Größe. Gleich darunter der fertige Aufruf.
Das Wichtigste auf einen Blick.
Der Schlüssel bleibt auf Ihrem Server
Er steht im Authorization-Header. Nie in einem Browser oder einer App.
- 6201.000
1.000 Codes pro Monat
Beginnt am 1. neu. Bis zu 30 Aufrufe pro Minute, je ein Code.
Die Marke kommt von selbst
Ein WhatsApp-Link bekommt das WhatsApp-Logo. Oder wählen Sie Ihre, oder keine.
- +52
59 Inhaltstypen
Dieselben wie im Editor, mit denselben Prüfregeln.
Ihr Stil, gespeichert
Im Profil gestalten und per id nutzen, oder direkt im Aufruf angeben.
- 400 · content.ssid: required429 · quota-exceeded500 · render-failed
Fehler, die sagen, was los ist
Ein Code für Ihr Programm, ein Satz für Menschen. Fehler kosten kein Kontingent.
Drei Adressen, mehr nicht.
Alle unter https://api.qrsensei.com, mit Ihrem Schlüssel im Authorization-Header. Antworten sind immer JSON.
POST/v1/qr
Zählt 1 Code Ihres Monats (1.000)
Erzeugt einen Code: Inhalt senden (und auf Wunsch Marke, Stil, Format und Größe) und das Bild als data-URL erhalten, mit Ihrem Restkontingent.
{ "image": "data:image/png;base64,…", "format": "png", "remaining": 902, "limit": 1000, "resetsAt": "…" }GET/v1/usage
Wird nicht gezählt
Wie viel Sie verbraucht haben und was diesen Monat bleibt, kostenlos. Praktisch vor einem großen Rechnungslauf.
{ "used": 98, "remaining": 902, "limit": 1000, "resetsAt": "…" }GET/v1/brands
Wird nicht gezählt
Die Marken, die Sie in brand angeben können. Öffentlich, ohne Schlüssel, gecacht.
{ "brands": ["qrsensei", "instagram", "whatsapp", …], "auto": "auto", "none": "none" }
Häufige Fragen
Ist es wirklich kostenlos? Wie viele Codes kann ich erzeugen?
Ja. Jedes Konto hat 1.000 Codes pro Monat, alle Anwendungen zusammen, und der Zähler beginnt am 1. neu. Der aktuelle Wert steht immer hier und in Ihrem Profil.
Speichern Sie den Inhalt meiner Codes?
Nein. Der Inhalt reist im Request-Body, wird gezeichnet und zurückgegeben; nichts davon wird gespeichert oder geloggt. Für Ihr Konto behalten wir nur einen Monatszähler.
PNG oder SVG?
SVG, wann immer Ihr PDF oder Ihre Seite es annimmt: in jeder Größe scharf und leichter. PNG für Systeme, die nur Bilder annehmen; es wird in der gewünschten Größe gezeichnet.
Welche Größe auf einer Rechnung?
Gedruckt 2 bis 3 cm, also size 256 bis 384 bei 300 dpi. Unter 1,5 cm zögern viele Handys. Das Testlabor zeigt die echte Größe auf dem Papier.
Kann ich die API aus dem Browser oder einer App aufrufen?
Nein: Der Schlüssel wäre für alle sichtbar. Rufen Sie sie von Ihrem Server auf und schicken Sie das fertige Bild an Browser oder App.
Wie bringe ich das Bild in ein PDF?
Die Antwort enthält das Bild als data-URL. In einem HTML-zu-PDF-Generator direkt in ein <img> setzen. In PDF-Bibliotheken das Base64 nach dem Komma nehmen, dekodieren und als Bild einfügen.
Ist der Code immer lesbar?
Jeder Stil wird vor der Annahme geprüft (passende Formen, mindestens 4,5:1 Kontrast), und die Fehlerkorrektur wird nach Größe und Logo gewählt. Testen Sie im Testlabor: Es liest den Code wie ein Handy.
Was passiert, wenn ich das Limit überschreite?
Die API antwortet mit 429 (quota-exceeded) und dem Datum des Neustarts; es wird nichts berechnet. Aufrufe mit Fehler zählen nie, und GET /v1/usage zeigt, was übrig ist.
Kann ich meine eigene Marke in die Mitte setzen?
Sie können die am Link erkannte Marke ("auto"), eine Katalogmarke, die von QrSensei oder keine verwenden. Eigene Logos lassen sich noch nicht über die API senden.
Welche Zahlungen kann der Code enthalten?
Jeden Zahlungslink (Stripe, PayPal, Mercado Pago …) als Link sowie die Formate, die Banken direkt lesen: SEPA (EPC, in Europa) und PIX (in Brasilien).
Kann sich die API ändern und mein System brechen?
Nicht ohne Ankündigung. Alles liegt unter /v1: Was heute funktioniert, bleibt; Neues kommt als optionale Felder.
Vollständige Referenz: alle Felder, Typen und Fehler
Code erzeugen
Ein POST mit dem Inhalt im Body. Der Inhalt steht nie in der Adresse, damit er nicht in den Logs von Servern unterwegs landet.
curl https://api.qrsensei.com/v1/qr \
-H "Authorization: Bearer $QRSENSEI_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": {
"type": "text",
"text": "FT 2026/118 · 149,90 EUR"
},
"brand": "qrsensei",
"style": {
"color": {
"kind": "solid",
"color": "#18181B"
}
},
"format": "png",
"size": 256
}'Request-Body
| Feld | Werte | Bedeutung |
|---|---|---|
| content | Objekt | Was der Code enthält, mit seinem type. Siehe Inhalte. |
| format | "svg" · "png" | Standardmäßig SVG: in jeder Größe scharf und leichter. PNG für Systeme, die nur Bilder annehmen. |
| size | 128 – 1024 | Die Bildseite in Pixeln (Standard 512). Für eine Rechnung reicht 256. |
| style | id · Objekt | Einer Ihrer Stile per id, oder ein im Aufruf geschriebener Stil. Ohne ihn: der Stil der Anwendung oder der Standard des Kontos. |
| brand | "auto" · "none" · … | Das Logo in der Mitte: am Link erkannt (auto), der Name einer Marke, oder keines. |
Antwort
{
"image": "data:image/png;base64,iVBORw0KGgo…",
"format": "png",
"remaining": 902,
"limit": 1000,
"resetsAt": "2026-12-01T00:00:00.000Z"
}Dieselben Zahlen stehen in den Headern X-QrSensei-Remaining, X-QrSensei-Limit und X-QrSensei-Reset.
Authentifizierung
Jeder Aufruf trägt den Schlüssel Ihrer Anwendung im Header Authorization: Bearer qs_live_….
- Der Schlüssel wird nur einmal gezeigt, beim Erstellen. Wir behalten nur einen Fingerabdruck: Geht er verloren, erstellen Sie im Profil einen neuen, und der alte funktioniert nicht mehr.
- Rufen Sie von Ihrem Server auf, nie aus einem Browser oder einer App: Ein Schlüssel im Frontend-Code kann von jedem gelesen werden.
- Von den Codes wird nichts gespeichert: weder Inhalt noch Bilder. Nur eine Zählung pro Monat.
Inhalte
Dieselben Typen wie im Editor, mit denselben Regeln. Diese Tabelle wird aus den Regeln gelesen, die jeden Aufruf prüfen: Sie kann nicht veralten.
| type | Pflicht | Optional |
|---|---|---|
| url | url | — |
| text | text | — |
| phone | phone | — |
| subject, body | ||
| sms | phone | message |
| wifi | ssid, password | encryption, hidden |
| vcard | firstName | lastName, organization, title, phone, email, website, address, note |
| raw | payload | — |
| phone | message | |
| telegram | usernameOrHandle | message |
| signal | recipient | message |
| viber | recipient | message |
| mecard | name | organization, phone, email, website, address, note |
| geo | latitude, longitude | label |
| googleMaps | — | latitude, longitude, query |
| waze | — | latitude, longitude, query |
| event | title, start, end | location, description, allDay |
| pix | pixKey, merchantName, merchantCity | amount, txid, description |
| epc | beneficiaryName, iban | bic, amount, reference, remittance |
| paypal | paypalHandleOrEmail | amount, currency, note, paymentUrl |
| mbway | phone | amount, note |
| cryptoWallet | address | currency, amount, network, memo |
| deepLink | uri | — |
| otp | issuer, accountName, secret | otpType, algorithm, digits, period, counter |
| auth | uri | — |
| structuredText | text | — |
| paramUrl | baseUrl | params |
| customContent | content | — |
| Links | url | calendarLink · instagram · facebook · linkedin · x · tiktok · youtube · github · spotify · snapchat · pinterest · threads · discord · appStore · googlePlay · appGallery · microsoftStore · pdf · fileDownload · onlineDocument · portfolio · menu · digitalCard · coupon · landingPage · form · review · checkIn · rsvp · catalog · credentialLink |
Ein WLAN ohne Passwort bekommt encryption "nopass". Ein weggelassenes Feld bleibt leer; ein fehlendes Pflichtfeld wird im detail des Fehlers genannt.
Stile
Im Profil gestaltet, mit dem Code live daneben. Jeder hat eine id, einer ist Ihr Standard; oder schreiben Sie den Stil direkt in den Aufruf, als style.
{}{ "color": { "kind": "solid", "color": "#18181B" }, "background": { "kind": "transparent" }, "quietZone": 2 }{ "dots": "dots", "finders": "drop", "color": { "kind": "gradient", "type": "linear", "angle": 45, "stops": [ "#0F172A", "#1E40AF" ] }, "background": { "kind": "solid", "color": "#FFF7ED" } }Ein Stil wird nur angenommen, wenn er lesbar ist: Formen, die zusammenpassen, und Tinte dunkler als ihr Papier, mit mindestens 4,5:1 Kontrast. Ein transparenter Code wird gegen Weiß geprüft, das Papier einer Rechnung.
Marken
"auto" erkennt die Marke am Link (ein Instagram-Link bekommt das Instagram-Logo). Ein Name legt die Marke fest; "none" lässt die Mitte frei. Die Liste kommt auch von GET /v1/brands.
Gegen Phishing: Auf einem Link wird eine festgelegte Marke nur verwendet, wenn der Link ihr gehört. Das Logo einer Bank landet nie auf einem gefälschten Link.
- qrsensei
- x
- tiktok
- youtube
- github
- spotify
- telegram
- signal
- viber
- snapchat
- threads
- discord
- messenger
- googleMaps
- appleMaps
- waze
- paypal
- revolut
- wise
- stripe
Limits
| Pro Monat | 1.000 Codes pro Konto, alle Anwendungen zusammen. Beginnt am 1. um 00:00 UTC neu. |
| Pro Minute | 30 Aufrufe pro Anwendung. Ein Code pro Aufruf: keine Massenerzeugung. |
| Nicht gezählt | Aufrufe mit Fehler, GET /v1/usage und GET /v1/brands. |
Fehler
Immer ein error-Objekt mit code, message und, wo es hilft, detail: Der code ist für Ihr Programm, die message für Menschen. Ein Aufruf mit Fehler wird nicht gezählt.
| Status | code | Wann |
|---|---|---|
| 401 | missing-key | Kein Schlüssel im Authorization-Header. |
| 401 | invalid-key | Der Schlüssel existiert nicht oder wurde ersetzt. |
| 400 | invalid-json | Der Body ist kein JSON. |
| 400 | invalid-request | Ein Feld außerhalb der Liste oder ein Wert außerhalb des Bereichs; detail nennt es. |
| 400 | invalid-content | Ein Pflichtfeld fehlt oder ist falsch; detail nennt es. |
| 400 | unknown-brand | Diese Marke steht nicht in GET /v1/brands. |
| 422 | brand-mismatch | Eine festgelegte Marke auf einem fremden Link. |
| 404 | unknown-style | Diese Stil-id gehört nicht zu Ihrem Konto. |
| 403 | not-developer | Der Entwicklermodus ist im Konto ausgeschaltet. |
| 403 | suspended | Das Konto kann die API gerade nicht nutzen. |
| 413 | too-large | Der Body ist größer als 16 KB. |
| 429 | quota-exceeded | Die Codes dieses Monats sind aufgebraucht. |
| 429 | rate-limited | Zu viele Aufrufe in dieser Minute; Retry-After sagt, wie lange zu warten ist. |
| 500 | render-failed | Der Code konnte nicht gezeichnet werden. Nicht gezählt. |
| 503 | api-off | Die API ist vorübergehend abgeschaltet. Nicht gezählt. |