REST API documentation
REST API for customers with an active paid plan: create, edit, list and download dynamic QRs and read their scan counts from kiosks, supermarkets and checkouts. QRs created through the API carry the logo and colors of your account default design. Limit: 60 requests per minute per key.
Authentication
Generate your key in My account (active paid plan). It is shown only once; you can regenerate or revoke it. Send it in the Authorization: Bearer header. All responses are JSON, except images.
Authorization: Bearer q4u_<40 hex> Base URL: https://qr4u.cloud/api/v1
Endpoints
| Endpoint | Description |
|---|---|
POST /api/v1/qrs | Creates a dynamic QR with the account default design. JSON body: {"url": "https://..."}. Responds 201 with the QR. |
GET /api/v1/qrs | Lists your QRs (newest first). Parameters: limit (1-100, default 50) and offset. |
GET /api/v1/qrs/{code} | Returns one QR: code, url (short link), destination, status, scans, last_scan, created_at. |
PATCH /api/v1/qrs/{code} | Changes the destination. JSON body: {"url": "https://..."}. The printed QR stays the same. |
GET /api/v1/qrs/{code}/stats | Total scans and last scan date. |
GET /api/v1/qrs/{code}.png | PNG image of the QR with its design (ECC H). |
GET /api/v1/qrs/{code}.svg | SVG image of the QR with its design, logo embedded. |
Example
curl -X POST https://qr4u.cloud/api/v1/qrs \
-H "Authorization: Bearer $QR4U_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/menu"}'
HTTP/1.1 201 Created
{
"code": "k3m9pqx",
"url": "https://qr4u.cloud/k3m9pqx",
"destination": "https://example.com/menu",
"status": "active",
"scans": 0,
"last_scan": null,
"created_at": "2026-10-18T12:00:00Z",
"kind": "qr",
"mode": "dynamic",
"has_design": true,
"png": "https://qr4u.cloud/api/v1/qrs/k3m9pqx.png",
"svg": "https://qr4u.cloud/api/v1/qrs/k3m9pqx.svg"
}
Limits
60 requests per minute per key (sliding window). When exceeded it responds 429 with a Retry-After header (seconds).
Errors
Errors return JSON in the same shape with the matching HTTP status:
{"error": {"code": "invalid_url", "message": "Field \"url\" must be a valid http or https URL."}}
| Code | Description |
|---|---|
400 invalid_json / invalid_url | Invalid body, or a URL that is not http/https. |
401 unauthorized | The key is missing or invalid. |
402 plan_required | The paid plan has expired. |
404 not_found | The QR does not exist or is not yours. |
405 method_not_allowed | Method not allowed (see the Allow header). |
422 unsafe_url / design_unreadable | Destination flagged by Safe Browsing, or the default design does not produce a readable QR. |
429 rate_limited | More than 60 requests per minute. |
QRs created through the API use the account default design, which you set in the panel. If the design does not produce a readable QR, creation is rejected.