QR code JSON API: SVG string plus encode metadata
Same QR encoder as /v1/qr.svg, but the SVG comes back as a string inside JSON — useful when your script already expects JSON and will write the file itself.
/v1/qr?text=hello&ec=M returns JSON. No key, CORS on, 60 requests a minute./v1/qr
QR code as JSON wrapping the SVG string. Change the values and press Send request to call the live API.
Parameters
| Name | Type | What it does | Default |
|---|---|---|---|
text required | string | Payload to encode (URL or text), up to 1200 UTF-8 bytes | — |
ec | string | Error correction: L≈7%, M≈15%, Q≈25%, H≈30% | M |
border | integer | Quiet-zone modules, 1–8 | 2 |
box | integer | Module size 1–20 (affects SVG millimetre scale) | 10 |
fg | string | Dark-module hex colour like 000000 or #1f6f5c | — |
bg | string | Light-module / background hex colour | — |
Example
Request:
GET https://api.oddlathe.com/v1/qr?text=hello&ec=M
Response (generated by the real code when these docs were last built):
{
"svg": "<?xml version='1.0' encoding='UTF-8'?>\n<svg width=\"25mm\" height=\"25mm\" version=\"1.1\" viewBox=\"0 0 25 25\" xmlns=\"http://www.w3.org/2000/svg\"><rect fill=\"#ffffff\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" /><path d=\"M2,2H3V3H2zM3,2H4V3H3zM4,2H5V3H4zM5,2H6V3H5zM6,2H7V3H6zM7,2H8V3H7zM8,2H9V3H8zM11,2H12V3H11zM12,2H13V3H12zM16,2H17V3H16zM17,2H18V3H17zM18,2H19V3H18zM19,2H20V3H19zM20,2H21V3H20zM21,2H22V3H21zM22,2H23V3H22zM2,3H3V4H2zM8,3H9V4H8zM10,3H11V4H10zM11,3H12V4H11zM16,3H17V4H16zM22,3H23V4H22zM2,4H3V5H2zM4,4H5V5H4zM5,4H6V5H5zM6,4H7V5H6zM8,4H9V5H8zM11,4H12V5H11zM13,4H14V5H13zM14,4H15V5H14zM16,4H17V5H16zM18,4H19V5H18zM19,4H20V5H19zM20,4H21V5H20zM22,4H23V5H22zM2,5H3V6H2zM4,5H5V6H4zM5,5H6V6H5zM6,5H7V6H6zM8,5H9V6H8zM12,5H13V6H12zM13,5H14V6H13zM16,5H17V6H16zM18,5H19V6H18zM19,5H20V6H19zM20,5H21V6H20zM22,5H23V6H22zM2,6H3V7H2zM4,6H5V7H4zM5,6H6V7H5zM6,6H7V7H6zM8,6H9V7H8zM10,6H11V7H10zM11,6H12V7H11zM14,6H15V7H14zM16,6H17V7H16zM18,6H19V7H18zM19,6H20V7H19zM20,6H21V7H20zM22,6H23V7H22zM2,7H3V8H2zM8,7H9V8H8zM14,7H15V8H14zM16,7H17V8H16zM22,7H23V8H22zM2,8H3V9H2zM3,8H4V9H3zM4,8H5V9H4zM5,8H6V9H5zM6,8H7V9H6zM7,8H8V9H7zM8,8H9V9H8zM10,8H11V9H10zM12,8H13V9H12zM14,8H15V9H14zM16,8H17V9H16zM17,8H18V9H17zM18,8H19V9H18zM19,8H20V9H19zM20,8H21V9H20zM21,8H22V9H21zM22,8H23V9H22zM12,9H13V10H12zM13,9H14V10H13zM14,9H15V10H14zM2,10H3V11H2zM4,10H5V11H4zM6,10H7V11H6zM8,10H9V11H8zM11,10H12V11H11zM13,10H14V11H13zM18,10H19V11H18zM21,10H22V11H21zM4,11H5V12H4zM6,11H7V12H6zM7,11H8V12H7zM12,11H13V12H12zM16,11H17V12H16zM21,11H22V12H21zM22,11H23V12H22zM3,12H4V13H3zM5,12H6V13H5zM8,12H9V13H8zM10,12H11V13H10zM11,12H12V13H11zM12,12H13V13H12zM14,12H15V13H14zM18,12H19V13H18zM19,12H20V13H19zM20,12H21V13H20zM21,12H22V13H21zM22,12H23V13H22zM2,13H3V14H2zM3,13H4V14H3zM6,13H7V14H6zM16,13H17V14H16zM21,13H22V14H21zM3,14H4V15H3zM4,14H5V15H4zM6,14H7V15H6zM8,14H9V15H8zM9,14H10V15H9zM12,14H13V15H12zM14,14H15V15H14zM16,14H17V15H16zM18,14H19V15H18zM10,15H11V16H10zM11,15H12V16H11zM12,15H13V16H12zM13,15H14V16H13zM15,15H16V16H15zM17,15H18V16H17zM20,15H21V16H20zM21,15H22V16H21zM22,15H23V16H22zM2,16H3V17H2zM3,16H4V17H3zM4,16H5V17H4zM5,16H6V17H5zM6,16H7V17H6zM7,16H8V17H7zM8,16H9V17H8zM12,16H13V17H12zM13,16H14V17H13zM15,16H16V17H15zM16,16H17V17H16zM17,16H18V17H17zM20,16H21V17H20zM21,16H22V17H21zM22,16H23V17H22zM2,17H3V18H2zM8,17H9V18H8zM12,17H13V18H12zM13,17H14V18H13zM14,17H15V18H14zM15,17H16V18H15zM17,17H18V18H17zM18,17H19V18H18zM2,18H3V19H2zM4,18H5V19H4zM5,18H6V19H5zM6,18H7V19H6zM8,18H9V19H8zM10,18H11V19H10zM12,18H13V19H12zM13,18H14V19H13zM15,18H16V19H15zM16,18H17V19H16zM17,18H18V19H17zM21,18H22V19H21zM22,18H23V19H22zM2,19H3V20H2zM4,19H5V20H4zM5,19H6V20H5zM6,19H7V20H6zM8,19H9V20H8zM11,19H12V20H11zM16,19H17V20H16zM17,19H18V20H17zM20,19H21V20H20zM21,19H22V20H21zM2,20H3V21H2zM4,20H5V21H4zM5,20H6V21H5zM6,20H7V21H6zM8,20H9V21H8zM10,20H11V21H10zM11,20H12V21H11zM12,20H13V21H12zM14,20H15V21H14zM18,20H19V21H18zM20,20H21V21H20zM22,20H23V21H22zM2,21H3V22H2zM8,21H9V22H8zM11,21H12V22H11zM16,21H17V22H16zM18,21H19V22H18zM21,21H22V22H21zM2,22H3V23H2zM3,22H4V23H3zM4,22H5V23H4zM5,22H6V23H5zM6,22H7V23H6zM7,22H8V23H7zM8,22H9V23H8zM10,22H11V23H10zM11,22H12V23H11zM12,22H13V23H12zM14,22H15V23H14zM16,22H17V23H16zM17,22H18V23H17zM21,22H22V23H21zM22,22H23V23H22z\" id=\"qr-path\" fill=\"#000000\" fill-opacity=\"1\" fill-rule=\"nonzero\" stroke=\"none\" /></svg>",
"content_type": "image/svg+xml",
"ec": "M",
"border": 2,
"box": 10,
"fg": "#000000",
"bg": "#ffffff",
"bytes": 5,
"modules": 21,
"version": 1
}
Code examples
curl 'https://api.oddlathe.com/v1/qr?text=hello&ec=M'const params = new URLSearchParams({
text: "hello",
ec: "M"
});
const res = await fetch(`https://api.oddlathe.com/v1/qr?${params}`);
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();
console.log(data);import json, urllib.parse, urllib.request
params = urllib.parse.urlencode({"text": "hello", "ec": "M"})
url = "https://api.oddlathe.com/v1/qr?" + params
# Send a User-Agent: the edge network refuses Python's default one.
req = urllib.request.Request(url, headers={"User-Agent": "my-script/1.0"})
with urllib.request.urlopen(req, timeout=10) as r:
data = json.load(r)
print(data)When it's useful
- Build pipelines that want SVG source in a JSON response
- Inspecting QR version / module count for a given payload and ec level
- Anything that already wraps Anvil JSON helpers
Good to know
- Parameters match
/v1/qr.svg:text,ec,border,box,fg,bg. - Response fields:
svg,content_type,ec,border,box,fg,bg,bytes,modules,version. - Prefer
/v1/qr.svgwhen you can use the URL directly as an image source — one fewer hop and cacheable as an image. - Browser UI: Tooltern QR code generator.
Same QR as /v1/qr.svg, but the SVG is a string inside JSON — handy for scripts that already speak JSON. Prefer /v1/qr.svg when you can use it as an image URL.
Errors
Errors are JSON like {"error": {"code": "…", "message": "…"}}. The ones this endpoint can return:
missing_param(400): a required parameter is missing or emptybad_param(400): a value is the wrong type or out of range (the message says which)too_long(413): text is over 1200 bytesrate_limited(429): over 60 requests a minute; wait for Retry-After seconds
Questions
Which should I call?
Use /v1/qr.svg for <img src> and curl-to-file. Use /v1/qr when you need JSON.
Is the SVG identical?
Yes — same encoder, same defaults.
Related endpoints
/v1/qr.svgQR code as SVG (usable as an <img src>)/v1/colorColour formats (hex, RGB, HSL, OKLCH) and WCAG contrast/v1/loremLorem ipsum placeholder text: paragraphs, sentences or words
Prefer a page to an API?
- QR code generator (SVG/PNG, logo preview) on Tooltern: same job, nothing leaves your browser.
Published · OpenAPI 3.1 spec · Limits and privacy