AnvilJSON utilities

Anvil › Docs › /v1/qr

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.

In one line: GET /v1/qr?text=hello&ec=M returns JSON. No key, CORS on, 60 requests a minute.
GET

/v1/qr

QR code as JSON wrapping the SVG string. Change the values and press Send request to call the live API.

Parameters

NameTypeWhat it doesDefault
text requiredstringPayload to encode (URL or text), up to 1200 UTF-8 bytes—
ecstringError correction: L≈7%, M≈15%, Q≈25%, H≈30%M
borderintegerQuiet-zone modules, 1–82
boxintegerModule size 1–20 (affects SVG millimetre scale)10
fgstringDark-module hex colour like 000000 or #1f6f5c—
bgstringLight-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
curl 'https://api.oddlathe.com/v1/qr?text=hello&ec=M'
JavaScript (browser or Node 18+)
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);
Python (standard library only)
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.svg when 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 empty
  • bad_param (400): a value is the wrong type or out of range (the message says which)
  • too_long (413): text is over 1200 bytes
  • rate_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

Prefer a page to an API?

Published · OpenAPI 3.1 spec · Limits and privacy