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
| Field | Meaning |
|---|---|
type | data · url · text · promptpay · wifi · email · phone · sms · line |
data | the exact text to encode (no type needed) |
url / text | a link (http/https) / text |
target, amount | PromptPay: mobile number, 13-digit ID or 15-digit e-wallet; amount (optional) |
ssid, password, security, hidden | Wi-Fi (WPA · WEP · nopass) |
to, subject, body | |
number, message | phone / SMS |
id | LINE ID, @official account or a line.me link |
format | png · svg |
size | PNG width 64–4096 px (default 512) |
level | error correction L · M · Q · H (default M) |
color, background | #rrggbb · background transparent |
margin | quiet 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
Tracked QR
GET /links | the account's links (per_page, page) |
POST /links | create: destination (http/https), title |
POST /links/bulk | create many: items [{destination, title}, ...] |
GET /links/{code} | one link |
PATCH /links/{code} | change destination, title, status (active · paused) |
GET /links/{code}/stats?days=30 | scans 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