Guide

QR codes that are checked before you get them

Styled modules, your logo in the center, and a guarantee the free libraries do not make: every code is decoded on the way out, or you get your credit back.

Putting a logo in a QR code is where generators quietly fail. The logo destroys the modules it covers, error correction absorbs the damage until it cannot, and nobody in the pipeline ever scans the result - the first scan attempt happens in the wild, off a printed menu or an invoice. Renderwolf refuses to take that bet: after drawing your code it decodes the finished image and compares the payload byte for byte. If styling or the logo broke it, the API returns 422 unscannable and refunds the render instead of shipping it.

A branded code in one request

The logo forces the highest error-correction level automatically.

curl -X POST https://api.ironfang.uk/renderwolf/v1/qr \
  -H "Authorization: Bearer if_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "data": "https://example.com/menu",
    "size": 640,
    "dots": "circle",
    "dark": "#1b2a4a",
    "logo_url": "https://example.com/logo.png",
    "logo_size": 0.22
  }' --output menu-qr.png

dots takes square or circle; eyes styles the three finder squares and defaults to match. The finder patterns themselves always render solid whatever you pick, because a scanner locates the symbol by their 1:1:3:1:1 pixel ratio and dot-styled finders are how other generators produce codes that do not scan. Colors are yours, with two rules the API enforces up front: dark must genuinely be darker than light, and the contrast between them has to be wide enough to binarize - both are refused as a 400 before anything is charged.

A payment QR on an invoice PDF

The reason QR lives inside a rendering API at all: codes belong on documents. Any stored template can carry one - add an img slot where the code should sit.

The template. {{qr.pay}} is filled by the render call.

<div class="invoice-footer">
  <p>Scan to pay invoice {{invoice}}</p>
  <img src="{{qr.pay}}" width="150" height="150">
</div>

Each qr entry is rendered, scan-verified and injected as a variable. No extra charge - it is part of this render.

curl -X POST https://api.ironfang.uk/renderwolf/v1/image/YOUR_TEMPLATE_ID \
  -H "Authorization: Bearer if_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "vars": { "invoice": "INV-2041" },
    "qr":  { "pay": { "data": "https://pay.example.com/INV-2041", "size": 300 } }
  }' --output invoice-card.png

Next