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.
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=.
{
"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.
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.
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).
{
"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.