Skip to content
API for members

QRnaka API

Make QR images one at a time or many at once, create and change tracked QR codes, and read their scan statistics from your own systems. For members (the free trial included). Make an API key at Account > API.

Authentication

Send the key with every call: Authorization: Bearer qrn_... (or X-Api-Key). Keep it secret: never in a web page or an app other people can open. If a key leaks, revoke it and make a new one. Every answer is JSON in English, except the QR images.

curl -H "Authorization: Bearer qrn_..." https://www.qrnaka.com/api/v1/me

Limits

  • 60 calls a minute and 10,000 a day per key (429 beyond)
  • Up to 500 items per many-at-once request · 1,000 new tracked QR codes a day
  • A membership past its grace days gets 402 until it is renewed (QR codes already made keep working)

POST /qr

One QR: a PNG (default) or SVG image · add ?response=json for base64

curl -X POST https://www.qrnaka.com/api/v1/qr \
  -H "Authorization: Bearer qrn_..." -H "Content-Type: application/json" \
  -d '{"type":"promptpay","target":"0812345678","amount":"150","format":"png","size":600,"level":"H"}' \
  -o promptpay.png
FieldMeaning
typedata · url · text · promptpay · wifi · email · phone · sms · line
datathe exact text to encode (no type needed)
url / texta link (http/https) / text
target, amountPromptPay: mobile number, 13-digit ID or 15-digit e-wallet; amount (optional)
ssid, password, security, hiddenWi-Fi (WPA · WEP · nopass)
to, subject, bodye-mail
number, messagephone / SMS
idLINE ID, @official account or a line.me link
formatpng · svg
sizePNG width 64–4096 px (default 512)
levelerror correction L · M · Q · H (default M)
color, background#rrggbb · background transparent
marginquiet zone 0–16 modules (default 4)

POST /qr/bulk

Many QR codes in one request, as a ZIP (items that could not be made are listed in errors.txt) · ?response=json returns base64 per file with per-item errors · PNG at most 1024 px wide (use SVG for large prints)

curl -X POST https://www.qrnaka.com/api/v1/qr/bulk \
  -H "Authorization: Bearer qrn_..." -H "Content-Type: application/json" \
  -d '{"format":"svg","level":"Q","items":[
        {"name":"table-1","url":"https://example.com/menu?t=1"},
        {"name":"table-2","url":"https://example.com/menu?t=2"},
        {"name":"wifi","type":"wifi","ssid":"Shop","password":"secret"}]}' \
  -o qr.zip
GET /linksthe account's links (per_page, page)
POST /linkscreate: destination (http/https), title
POST /links/bulkcreate many: items [{destination, title}, ...]
GET /links/{code}one link
PATCH /links/{code}change destination, title, status (active · paused)
GET /links/{code}/stats?days=30scans by day, device and area
curl -X POST https://www.qrnaka.com/api/v1/links \
  -H "Authorization: Bearer qrn_..." -H "Content-Type: application/json" \
  -d '{"destination":"https://example.com/promo","title":"Poster A"}'

{"link":{"code":"ab12cd3","short_url":"https://qrnaka.net/r/ab12cd3","status":"active","scans":0,...}}

Put the short_url in a QR (with POST /qr) and print it; change where it goes later with PATCH, without printing again.

Errors

{"error":{"code":"invalid","message":"url must start with http:// or https://"}}

401 unauthorized · 402 membership_required · 403 account_disabled / links_disabled · 404 not_found · 422 invalid / too_many · 429 rate_limited / daily_limit · 503 unavailable