API documentation

Create QR codes, change where they point and read scans and leads from your own systems. Included from the Plus plan.

Authentication

Create a key under Dashboard → API keys and send it with every request. Base URL: https://qrgurus.com/api/v1. Limit: 60 requests per minute per key (HTTP 429 with Retry-After when exceeded).

curl https://qrgurus.com/api/v1/codes \
  -H "Authorization: Bearer qrg_your_key" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/spring","name":"Spring flyer","template":0,
       "variables":{"machine_id":"VM-1023"}}'

Endpoints

GET/meYour plan and dynamic-code usage.
GET/codesList codes. Query: project_id, limit (≤100), page.
POST/codesCreate a code. Body: url (or type + content), kind (dynamic|static), name, template or design, project_id, flow_id, variables.
GET/codes/{id}One code.
PATCH/codes/{id}Update name, status (active|paused), destination, variables, flow_id, project_id, design.
DELETE/codes/{id}Delete a code. Printed copies stop working.
GET/codes/{id}/image.svgThe styled QR code as SVG.
GET/codes/{id}/scansScan stats. Query: days (1–365). Totals, per day, countries, cities, OS, devices, latest 50 scans.
GET/leadsForm submissions. Query: code_id, since (ISO date), limit, page.
GET/projectsList projects.
POST/projectsCreate a project. Body: name.
GET/flowsList routing flows (to use as flow_id).

Errors

Errors return a 4xx status and {"error": {"code": "invalid", "message": "…"}}. Codes: unauthorized, plan_required, rate_limited, not_found, invalid, static_code, bad_json.

Webhooks

Add a webhook URL to a flow in the Routing studio. Each lead is POSTed as JSON with event, qr_code, fields, variables, country, city and created_at. Failed deliveries are retried up to 6 times over about two hours.