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.pngdots 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