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

EndpointDescription
POST /api/v1/qrsCreates a dynamic QR with the account default design. JSON body: {"url": "https://..."}. Responds 201 with the QR.
GET /api/v1/qrsLists 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}/statsTotal scans and last scan date.
GET /api/v1/qrs/{code}.pngPNG image of the QR with its design (ECC H).
GET /api/v1/qrs/{code}.svgSVG 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."}}
CodeDescription
400 invalid_json / invalid_urlInvalid body, or a URL that is not http/https.
401 unauthorizedThe key is missing or invalid.
402 plan_requiredThe paid plan has expired.
404 not_foundThe QR does not exist or is not yours.
405 method_not_allowedMethod not allowed (see the Allow header).
422 unsafe_url / design_unreadableDestination flagged by Safe Browsing, or the default design does not produce a readable QR.
429 rate_limitedMore 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.