Kostenlose Beta

QR-Code-API

Erzeuge individuell gestaltete QR-Codes direkt aus deiner Anwendung. Ein REST-Aufruf liefert SVG oder PNG und nutzt dieselbe Render-Engine wie der QRocodile-Generator.

Was die API macht

Du schickst Inhalt und optional ein Design, der Response-Body ist das fertige Bild. Es läuft kein Browser mit, du brauchst keine QR-Bibliothek und ein Wasserzeichen gibt es nicht. Die API nutzt dieselbe Render-Engine wie der QRocodile-Generator: Ein Design, das du im Generator gestaltest, sieht per API genauso aus.

Weil es reines HTTP mit einem Bearer-Token ist, funktioniert es aus jedem Backend und aus dem HTTP-Node von Automatisierungsplattformen wie n8n, Zapier, Make oder KNIME. Typische Aufgaben sind Batch-Läufe über eine Produkt- oder Ticketliste, QR-Codes auf Rechnungen und Versandlabels direkt vom Server und Druck-Workflows, die Vektorausgabe in einem festen Stil benötigen.

Wir rendern, aber wir speichern nicht. Der kodierte Inhalt landet in keiner Datenbank. Erfasst werden nur Metadaten der Anfrage: API-Key, Zeitpunkt, Format und Größe. Genau diese Angaben benötigen wir für Missbrauchsschutz und Nutzungszählung.

Das steckt drin

Alle Stile aus dem Generator

Jeder Muster- und Finder-Stil aus dem Generator ist über seine ID verfügbar, dazu Vorlagen, Paletten und Farbverläufe. Baue den QR-Code im Generator und kopiere sein JSON – alle verwendeten IDs stehen darin.

SVG und PNG

SVG ist Vektor und eignet sich für den Druck, PNG lässt sich in jeder Größe von 64 bis 4.096 Pixel anfordern. Die beiden unterscheiden sich um einen einzigen Parameter derselben Anfrage.

Dein eigenes Logo

Verwende eines der vorgegebenen Logos oder schicke dein eigenes PNG, JPEG oder SVG als Base64. Die Fehlerkorrektur passt sich an, damit der QR-Code scannbar bleibt.

Stets scannbar

Farbkombinationen mit zu wenig Kontrast werden automatisch nachjustiert, damit ein QR-Code, der gut aussieht, auch scannbar bleibt.

Deterministische Ausgabe

Dieselbe Anfrage liefert immer dieselben Bytes: Wiederholungen sind gefahrlos, Ergebnisse kannst du bei dir zwischenspeichern.

Schnellstart

  1. 1

    API-Key anfordern

    Trag unten deine E-Mail-Adresse ein und bestätige sie. Der API-Key wird genau einmal angezeigt – kopiere ihn und bewahre ihn sicher auf.

  2. 2

    Endpunkt aufrufen

    Sende Inhalt und optional ein Design und gib den API-Key als Bearer-Token mit.

  3. 3

    Bild verwenden

    Der Response-Body ist das Bild selbst, entweder SVG-Text oder PNG-Bytes. Schreib es in eine Datei, gib es weiter oder lege es dort ab, wo du deine Assets auslieferst.

Authentifizierung

Jede Render-Anfrage trägt einen API-Key als Bearer-Token. API-Keys sind kostenlos und an eine E-Mail-Adresse gebunden. Deinen bekommst du über das Formular weiter unten auf dieser Seite.

Authorization: Bearer qk_live_…

Der API-Key wird genau einmal angezeigt, sobald du den Code bestätigst, denn wir speichern nur einen Hash davon und können das Original nicht wiederherstellen. Halte ihn geheim. Er weist dir die Nutzung zu – wer ihn hat, kann dein Kontingent verbrauchen.

Wenn du den API-Key verlierst, registriere dieselbe Adresse erneut. Mit dem neuen Code wird ein frischer API-Key ausgegeben und der alte wird ungültig. Bis zur Bestätigung funktioniert der bisherige API-Key ganz normal weiter.

Endpunkte

Basis-URL und Versions-Präfix sind stabil. Das Design-Schema ist an diese Version gebunden und wird nur erweitert – kommen neue Felder dazu, laufen bestehende Integrationen also weiter.

https://api.qrocodile.io

Beschreibung
QR-Code aus einem Inhalts-String und optionaler Vorlage rendern
Beschreibung
QR-Code aus einem Inhalts-String und vollem Design-Schema rendern

Einfaches Rendern

GET /v1/qr

Nimm diesen Endpunkt, wenn die ganze Anfrage in eine URL passt. Er liefert die Bild-Bytes direkt.

Query-Parameter

content *
Typ
string
Standard
Beschreibung
Der zu kodierende String, exakt so übernommen
format
Typ
enum (svg | png)
Standard
svg
Beschreibung
Ausgabeformat
Typ
enum (86 presets)
Standard
Beschreibung
Eine der unten aufgelisteten Vorlagen-IDs
size
Typ
integer (64–4096)
Standard
1024
Beschreibung
Pixelgröße für die PNG-Ausgabe
margin
Typ
integer (0–20)
Standard
Beschreibung
Ruhezone, in Modulen
dark
Typ
string (hex color)
Standard
Beschreibung
Modulfarbe, als Hex
bg
Typ
string (hex color)
Standard
Beschreibung
Hintergrundfarbe, als Hex

* Pflichtfeld – alles andere ist optional

Vorlagen

Eine Vorlage – im Design-Schema das Feld preset – ist der schnellste Weg zu einem fertig gestalteten QR-Code. Du sendest nur ihre ID – Stile und Farben bringt die Vorlage mit. Nimm eine ID aus der Liste unten.

Alles über eine Vorlage hinaus benötigt das vollständige Design-Schema. Das passt nicht in einen Query-String – siehe Volles Design unten.

Volles Design

POST /v1/qr

Die Antwort ist dieselbe, die Eingabe ist umfangreicher: ein JSON-Body mit dem Inhalt und einem vollständigen Design-Schema. Dieses Schema ist genau das Objekt, das auch der QRocodile-Generator erzeugt – was du dort visuell zusammenstellen kannst, kannst du hier also auch anfragen.

content *
Typ
string
Standard
Beschreibung
Der zu kodierende String, exakt so übernommen
design
Typ
QrDesignConfig
Standard
{}
Beschreibung
Vorlage, Farben, Muster- und Finder-Stile, Logo und Halo. Kopiere es im Generator über „JSON kopieren“ – dabei entsteht genau dieses Objekt.
format
Typ
enum (svg | png)
Standard
svg
Beschreibung
Ausgabeformat
size
Typ
integer (64–4096)
Standard
1024
Beschreibung
Pixelgröße für die PNG-Ausgabe
fixContrast
Typ
boolean
Standard
true
Beschreibung
Zu geringen Kontrast nachjustieren, damit der QR-Code scannbar bleibt

* Pflichtfeld – alles andere ist optional

Baue den QR-Code visuell im Generator. Klicke dann unten rechts in der Vorschau auf den Pfeil nach oben und wähle „JSON kopieren“: Du erhältst genau das Objekt, das dieses Feld erwartet. Als design eingesetzt, entsteht exakt das Bild, das du gesehen hast, mit Logo und Halo.

Ein Feld unterstützt dieser Endpunkt noch nicht: animation, das der Generator für animierte Ausgaben exportiert. Hier entsteht ein einzelnes Bild, ein Design mit diesem Feld wird deshalb mit einem Fehler abgelehnt. Entferne es, wenn du ein Standbild brauchst.

Generator öffnen

Beispiele

Ein Link mit Vorlage
Ein individuell gestalteter QR-Code mit Logo
curl -X POST https://api.qrocodile.io/v1/qr \
  -H "Authorization: Bearer $QR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "WIFI:T:WPA;S:Cafe Guest;P:latte123;;",
    "design": {
      "preset": "ocean",
      "moduleColor": "#0d9488",
      "moduleStyleId": "roundedSquares",
      "logo": { "id": "wifi", "color": "#0d9488", "regionWidth": 0.25 }
    },
    "format": "png",
    "size": 1024
  }' \
  --output wifi.png
import { writeFile } from 'node:fs/promises'

const res = await fetch('https://api.qrocodile.io/v1/qr', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.QR_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    content: 'WIFI:T:WPA;S:Cafe Guest;P:latte123;;',
    design: {
      preset: 'ocean',
      moduleColor: '#0d9488',
      moduleStyleId: 'roundedSquares',
      logo: { id: 'wifi', color: '#0d9488', regionWidth: 0.25 },
    },
    format: 'png',
    size: 1024,
  }),
})
if (!res.ok) throw new Error(`QR API ${res.status}`)

await writeFile('wifi.png', Buffer.from(await res.arrayBuffer()))
import os
import requests

res = requests.post(
    "https://api.qrocodile.io/v1/qr",
    headers={"Authorization": f"Bearer {os.environ['QR_API_KEY']}"},
    json={
        "content": "WIFI:T:WPA;S:Cafe Guest;P:latte123;;",
        "design": {
            "preset": "ocean",
            "moduleColor": "#0d9488",
            "moduleStyleId": "roundedSquares",
            "logo": {"id": "wifi", "color": "#0d9488", "regionWidth": 0.25},
        },
        "format": "png",
        "size": 1024,
    },
    timeout=30,
)
res.raise_for_status()

with open("wifi.png", "wb") as f:
    f.write(res.content)
Tausend QR-Codes, ein Stil JavaScript
import { writeFile } from 'node:fs/promises'
import { setTimeout as sleep } from 'node:timers/promises'

// One design for the whole run; only the encoded content changes.
const design = { preset: 'ocean', moduleStyleId: 'roundedSquares' }
const skus = ['SKU-001', 'SKU-002', 'SKU-003'] // … a few thousand more

for (const sku of skus) {
  const res = await fetch('https://api.qrocodile.io/v1/qr', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.QR_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ content: `https://myshop.com/p/${sku}`, design, format: 'svg' }),
  })
  if (!res.ok) throw new Error(`${sku}: QR API ${res.status}`)

  // arrayBuffer, not text, so switching format to 'png' needs nothing but a new extension.
  await writeFile(`out/${sku}.svg`, Buffer.from(await res.arrayBuffer()))

  // The limit is 60 renders per minute per key, so one per second is a safe steady rate.
  await sleep(1000)
}

Die API rendert einen QR-Code pro Anfrage, ein Batch-Durchlauf wird also als Schleife in deiner Anwendung implementiert. Die einzelnen Renderings sind voneinander unabhängig. Du kannst die Schleife also so takten, dass du innerhalb deines Limits bleibst, und sie dann unbeaufsichtigt laufen lassen. Wenn du eine hohe Druckauflage in einem Durchgang brauchst, schreib uns, dann erhöhen wir die Obergrenze.

Fehler

Ein Fehler kommt nie als defektes Bild zurück. Die Antwort ist JSON mit einem stabilen, maschinenlesbaren Fehlercode; bei Erfolg enthält der Body immer ein Bild:

Fehler-Antwort JSON
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "body/design/preset Invalid option: expected one of \"classic\"|\"ocean\"|…"
  }
}
400
Wann
Inhalt oder Design haben die Validierung nicht bestanden, oder das Format wird nicht unterstützt. Die Meldung nennt das betroffene Feld und listet bei einer ID die gültigen Optionen auf.
401
Wann
Der API-Key fehlt, ist ungültig, unbekannt oder widerrufen.
413
Wann
Ein eigenes Logo oder eine angefragte PNG-Größe hat das jeweilige Limit überschritten.
422
Wann
Die Eingabe war gültig, ließ sich aber nicht kodieren. In der Praxis heißt das, der Inhalt ist zu lang für einen QR-Code.
429
Wann
Du hast das Limit überschritten. Die Response-Header geben an, wann du es erneut versuchen kannst.
500
Wann
Ein Rendering ist bei uns fehlgeschlagen. Das sollte eigentlich nicht vorkommen. Wir loggen den Fehler, aber absichtlich nicht deinen Inhalt – wenn dir das passiert, hilft uns eine kurze Angabe zu Inhalt und Design, ihn nachzustellen.

Rate Limits

Renderings sind auf 60 Anfragen pro Minute und API-Key begrenzt. Das Limit liegt hoch genug, dass normale Automatisierung es nie erreicht, und niedrig genug, dass ein Skript in einer Endlosschleife auffällt. Weil das Limit am API-Key hängt und nicht an der aufrufenden IP-Adresse, folgt das Budget deiner Integration, egal wo sie läuft. Wenn du für den produktiven Einsatz mehr brauchst, schreib uns: In der Beta erhöhen wir Limits von Hand und sind dabei großzügig.

Jede Render-Antwort trägt diese Header. Eine Schleife kann sich also takten, lange bevor sie ins Limit läuft:

x-ratelimit-limit
Bedeutung
Erlaubte Anfragen pro Minute
x-ratelimit-remaining
Bedeutung
Verbleibende Anfragen in der laufenden Minute
x-ratelimit-reset
Bedeutung
Sekunden, bis das Fenster zurückgesetzt wird
retry-after
Bedeutung
Wartezeit in Sekunden, nur bei Statuscode 429

Clients & SDKs

Die API ist reines HTTP. Jede Sprache mit einem HTTP-Client funktioniert damit, die Beispiele oben laufen unverändert. Ein typisierter TypeScript-Client ist in Arbeit, weitere Sprachen folgen; bis dahin ist die OpenAPI-Spezifikation der schnellste Weg dorthin.

Die vollständige Spezifikation liegt unter /docs/json. Daraus erzeugt ein Code-Generator einen typisierten Client in deiner Sprache – inklusive der Design-IDs als Enums.

API-Referenz öffnen

War das hilfreich?

Teile es mit jemandem, der es brauchen kann.

Hol dir deinen API-Key

Pro E-Mail-Adresse gibt es einen kostenlosen API-Key. Adresse unten eintragen, bestätigen – fertig.

Dein API-Key

Kopiere ihn jetzt, denn er wird nur dieses eine Mal angezeigt. Wir speichern nur einen Hash davon und können das Original nicht wiederherstellen.

Erste Schritte mit deinem API-Key

Wir speichern deine E-Mail-Adresse, um den API-Key auszugeben, die Nutzung zu zählen und dich zur API zu erreichen. Nichts weiter, kein Newsletter. Datenschutz

Häufige Fragen zur API

?
Was kostet die API?

In der Beta nichts. API-Keys gibt es, damit sich Nutzung zuordnen und begrenzen lässt, nicht um abzurechnen. Sollten später bezahlte Stufen kommen, geht es dabei um Volumen. Die kostenlose Stufe bleibt nutzbar.

?
Warum brauche ich überhaupt einen API-Key?

Rendern kostet uns CPU-Zeit; Nutzung muss deshalb zählbar und der Zugang widerrufbar sein. Außerdem hängen deine Limits so an deiner Integration und nicht an der IP-Adresse, von der sie gerade aufruft.

?
Was ist der Unterschied zum kostenlosen Generator?

Gleiche Engine, andere Oberfläche. Die Website ist zum Gestalten eines einzelnen QR-Codes gedacht, die API zum Erzeugen vieler aus deinen eigenen Systemen. Visuell gestalten, dann mit derselben Konfiguration automatisieren.

?
Kann ich die API direkt in einem <img>-Tag verwenden?

Bitte nicht. Der API-Key steckt im Authorization-Header, den ein <img>-Tag nicht mitsenden kann – ein solcher Verweis schlägt also einfach fehl. Aus JavaScript ließe sich der Header setzen, dann stünde der API-Key aber im Code, den jeder Besucher lesen kann. Damit könnte jeder dein Kontingent verbrauchen. Die API ist für Aufrufe aus deiner eigenen Anwendung gedacht, nicht aus dem Browser: Rendere den QR-Code vorab – im Build, in einem Skript oder auf dem Server –, lege das Ergebnis bei deinen übrigen Assets ab und liefere es von dort aus. Das ist für deine Besucher auch schneller, weil das Bild dann von deiner eigenen Domain oder deinem CDN kommt und nicht bei jedem Seitenaufruf von uns.

?
Warum scheitert ein fetch aus dem Browser an CORS?

Das ist Absicht. Die Render-Endpunkte akzeptieren den Authorization-Header nicht von Browser-Origins. Genau das verhindert, dass ein API-Key im Frontend-Code landet. Rufe die Render-Endpunkte stattdessen aus deiner Anwendung auf.

?
Gibt es eine OpenAPI-Spezifikation (Swagger)?

Ja. Das maschinenlesbare Dokument ist OpenAPI und liegt unter /docs/json, die lesbare Referenz unter /docs ist Swagger UI – „Swagger“ ist der ältere Name des Formats, deshalb begegnen dir beide. Wie du daraus einen typisierten Client erzeugst, steht oben unter „Clients & SDKs“.

?
Welche Formate bekomme ich?

SVG und PNG. SVG ist Vektor und ideal für den Druck, PNG kannst du in jeder Größe zwischen 64 und 4.096 Pixel anfordern. Animierte Ausgabe und PDF gibt es noch nicht.

?
Kann ich mein eigenes Logo verwenden?

Ja. Schicke es als Base64-PNG, -JPEG oder -SVG. Alternativ nutzt du eines der vorgegebenen Logos. Von einer URL laden wir ein Logo nie. Ein hochgeladenes SVG bereinigen wir vor der Ausgabe.

?
Speichert ihr die Inhalte, die ich kodiere?

Nein. Der Inhalt wird ins Bild kodiert und danach verworfen. Wir loggen Metadaten der Anfrage (API-Key, Zeitpunkt, Format und Größe) für Missbrauchsschutz und Nutzungszählung, aber nie den Inhalt selbst.

?
Darf ich die QR-Codes kommerziell nutzen?

Ja. Die erzeugten QR-Codes gehören dir, ohne Namensnennung und ohne Wasserzeichen, in kommerziellen Produkten genauso wie in Druckauflagen.

?
Kann ich WLAN, eine Visitenkarte oder eine Telefonnummer kodieren?

Ja. Das sind Textformate, keine Funktionen: Ein WLAN-Code ist der String WIFI:T:WPA;S:MeinNetz;P:geheim;;, ein Telefon-Code tel:+4915112345678. Baue den String in deiner Anwendung und sende ihn als content – die API kodiert genau das, was sie bekommt. Wir setzen diese Payloads absichtlich nicht für dich zusammen. Sonst gäbe es ein eigenes Feldvokabular, das du zusätzlich zum ohnehin dokumentierten Format lernen müsstest.

?
Sind das dynamische QR-Codes?

Nein. Die API rendert statische QR-Codes, der Inhalt steckt also im Muster selbst. Damit läuft nichts ab und nichts hängt davon ab, dass wir online bleiben. Nachträglich änderbare Weiterleitungen sind ein anderes Produkt.