{
  "service": "api-qr",
  "description": "QR codes as SVG or PNG via uqr + fflate.",
  "limits": {
    "max_data_utf8_bytes": 4096,
    "size_px": [
      32,
      1000
    ],
    "border_modules": [
      0,
      4
    ]
  },
  "endpoints": {
    "docs_html": "GET /",
    "render": "GET /?data=…&format=svg|png&size=&color=&bg=&ecl=&border=&alt=&download=&filename=",
    "validate": "GET /validate?data=…&ecl= or &ecc=",
    "embed_widget": "GET /embed/",
    "discovery": "GET /meta"
  },
  "params": {
    "data": "Required for render. Text or URL to encode.",
    "format": "svg (default) | png",
    "size": "Approx. width/height (32–1000), default 400",
    "color": "Foreground #rgb or #rrggbb",
    "bg": "Background #rgb or #rrggbb",
    "ecl": "Error correction L | M | Q | H (default M). Alias: ecc",
    "border": "Quiet zone in modules (0–4, default 1)",
    "alt": "Accessible label for SVG (aria-label + title)",
    "download": "If 1 or true, Content-Disposition: attachment",
    "filename": "Safe basename for download (optional)"
  },
  "ideas_next": [
    "POST / with JSON { data } for bodies longer than URL limits",
    "WiFi / vCard / SMS preset encodings (structured payload helpers)",
    "GET /scan redirect — encoded URL opens after scan (tracking, A/B)",
    "Short-lived signed URLs for dynamic destination changes",
    "Batch JSON: multiple data strings → ZIP of PNGs"
  ]
}