QR codes and printable labels
DPP Agent renders QR codes and printable labels on demand. Both endpoints are public and need no key: anyone with a DPP id can request a QR or a label. Branding (dot style, eye style, centre logo, wordmark, font, layout) comes from the tenant's saved designs under Print → QR and Print → Labels in the dashboard.
QR code
GET /api/v1/qr?dppid={uuid}
Query parameters
| Param | Default | Notes |
|---|---|---|
url |
— | Address to encode (instead of dppid) |
dppid |
— | DPP UUID; encodes the passport's public address |
tenant |
from the DPP | Tenant UUID; loads the tenant's default design |
design |
tenant default | A saved QR design id |
src |
— | tag or label: which label the code is printed on, added to the encoded address as ?src= |
format |
svg |
svg or png |
size |
240 | Pixel size of the PNG |
color |
000000 |
Foreground hex, no # |
bg |
ffffff |
Background hex |
dot_style |
square |
square, rounded-soft, rounded, rounded-heavy, dots |
dot_size |
100 | Module coverage in %, 70–100 |
eye_style |
square |
square, rounded-soft, rounded, leaf |
eye_color |
color |
Hex |
margin |
4 | Quiet zone in modules, 0–8 (ISO/IEC 18004 asks for at least 4) |
ec |
M |
Error correction L, M, Q or H; raised automatically when a logo is set |
logo |
design's | Centre logo, https:// or data:image/ URL, up to 24 KB |
logo_pct |
design's | Logo size as % of the code, 8–40 |
module_mm |
0.4 | Printed module size in mm, used with the measurement-window options |
keep_host |
— | 1 to encode url exactly as given. Without it, an address on <slug>.dpp.dppagent.com is moved to the brand's verified domain |
download |
— | 1 to send the file as a download named after the product |
Examples
The tenant's default QR for a passport:
GET /api/v1/qr?dppid=3f2a9b1c-e0d8-4f8e-b308-d2541886e331
A 600 px PNG for print, with higher error correction, for a hang tag:
GET /api/v1/qr?dppid=3f2a9b1c-e0d8-4f8e-b308-d2541886e331&size=600&format=png&ec=Q&src=tag
A QR for any address, rounded, in a brand colour:
GET /api/v1/qr?url=https://example.com/recall-info&color=B14B2C&dot_style=rounded
Where the code was scanned
src=tag (a hang tag, read in the shop) or src=label (a sewn-in
label, read at home) goes into the encoded address. The passport
records it with each scan, Analytics shows the split, and Ask the
passport puts the questions that fit that moment first. Labels printed
from Print → Labels set it from the template's Where the code is
scanned from setting.
Cache
Cache-Control: public, max-age=600, s-maxage=600, with an ETag, so a
changed design shows within ten minutes.
Label SVG
GET /api/v1/label?dppid={uuid}
Renders a printable label from the tenant's default label template, or
from a specific one with template=. The output is SVG at the label's
physical size in millimetres.
Query parameters
| Param | Default | Notes |
|---|---|---|
dppid |
required | DPP UUID |
template |
tenant default | Label template id |
format |
svg |
Only svg; png answers 400 |
Cache: public, max-age=600, s-maxage=600.
Layouts
hangtag, care-label, neck-label, size-label, flag-label,
sticker-square, nameplate, bottle-wrap, tyre-strip,
bag-label and custom. Print → Labels has ready templates per
category to start from.
Variables
Text in a template can use placeholders, written $var:source.field$:
$var:tenant.name$ brand name
$var:dpp.product_name$ product name
$var:dpp.gtin$ GTIN
$var:dpp.batch$ batch
$var:dpp.serial$ serial
$var:dpp.cpv$ variant (CPV)
$var:dpp.size$ size
$var:dpp.color$ colour
$var:dpp.passport_url$ passport address
A placeholder with no value is left as written, so a missing value is visible on the proof.
Many labels at once
Print runs of many labels (a PDF sheet or a ZIP of files per passport) are made in the dashboard under Print → Labels.