Developers

API reference

REST API v1 — manage QR codes and pull analytics with cue_live_* bearer keys.

The Cue API is a predictable REST API over JSON. Create a key in Dashboard → API; keys look like cue_live_a1b2c3... and are sent as a bearer token. API access is included on Business and Enterprise plans.

Authentication
curl https://api.cueqr.dev/api/v1/qrcodes \
  -H "Authorization: Bearer cue_live_a1b2c3d4e5f6"

List QR codes

GET /api/v1/qrcodes returns your codes, newest first. Filter with ?folder=, ?tag=, or ?campaign=, and paginate with ?cursor=.

GET /api/v1/qrcodes → 200
{
  "data": [
    {
      "id": "qr_8fk2m1",
      "name": "Spring menu — window sticker",
      "type": "dynamic",
      "shortUrl": "https://cue.to/x7Kp2q",
      "destination": "https://example.com/menu/spring",
      "scans": 1284,
      "createdAt": "2026-05-02T09:14:00Z"
    }
  ],
  "nextCursor": null
}

Create a QR code

POST /api/v1/qrcodes creates a dynamic code and returns it with a ready-to-render short URL. Style accepts the same options as the designer.

POST /api/v1/qrcodes
curl -X POST https://api.cueqr.dev/api/v1/qrcodes \
  -H "Authorization: Bearer cue_live_a1b2c3d4e5f6" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Summer campaign — poster A",
    "destination": "https://example.com/summer",
    "folder": "campaigns/summer",
    "style": { "dots": { "shape": "rounded", "color": "#18181b" } }
  }'

Update a destination

PATCH /api/v1/qrcodes/:id/destination repoints a code atomically. The change propagates to the edge in seconds; printed codes keep working throughout.

PATCH /api/v1/qrcodes/qr_8fk2m1/destination
curl -X PATCH https://api.cueqr.dev/api/v1/qrcodes/qr_8fk2m1/destination \
  -H "Authorization: Bearer cue_live_a1b2c3d4e5f6" \
  -H "Content-Type: application/json" \
  -d '{ "destination": "https://example.com/menu/summer" }'

Analytics

GET /api/v1/analytics returns aggregates for a code or campaign. Choose a grain with ?interval=hour|day|week and a window with ?from= and ?to= (ISO 8601).

GET /api/v1/analytics?qrcode=qr_8fk2m1&interval=day → 200
{
  "qrcode": "qr_8fk2m1",
  "interval": "day",
  "series": [
    { "date": "2026-06-01", "scans": 214, "uniques": 187 },
    { "date": "2026-06-02", "scans": 189, "uniques": 165 }
  ],
  "byCountry": { "GB": 301, "IE": 64, "US": 38 },
  "byDevice": { "mobile": 355, "desktop": 41, "tablet": 7 }
}

Errors and limits

Errors use conventional status codes with a JSON body: { "error": { "code": "rate_limited", "message": "..." } }. Default rate limit is 120 requests per minute per key; check the X-RateLimit-Remaining header.