API reference

Base URL: https://<your-app>/api/v1. Authenticate with Authorization: Bearer qrf_… (create keys in App → API). Rate limit: 600 req/min per key.

Codes

`GET /codes?limit=50&offset=0&tag=rack` Returns your codes with `short_url`, scan counts and health.

`POST /codes` Create one code, or send an **array** for bulk (max 500 per request).

{ "name": "Rack GA-A-01", "mode": "dynamic", "type": "url",
  "payload": { "url": "https://wms.example.com/loc/GA-A-01" },
  "label": "GA-A-01", "sublabel": "Ground floor", "tags": ["rack"], "meta": { "floor": "G" } }

Types: url text wifi vcard email sms phone whatsapp location event upi app pdf file social review gs1 dpp asset. payload fields mirror the UI (e.g. wifi: ssid, password, auth; gs1: gtin, lot, serial, expiry, domain).

`GET /codes/{id}` · `PATCH /codes/{id}` · `DELETE /codes/{id}` PATCH accepts `destination, payload, design, label, sublabel, tags, meta, is_active, expires_at, scan_limit`. Every change creates a version (roll back in the UI).

Scans

`GET /scans?qr_id=&from=&to=&limit=1000` Raw events: time, country/region/city, device/os/browser, language, referrer, routing variant, outcome. No IP addresses are stored.

Images (no auth)

GET /api/qr?data=<urlencoded>&format=svg|png&size=1024&fg=%23000000&bg=%23ffffff&ecc=M&margin=1

Webhooks Workflow **webhook** actions POST JSON `{event, qr:{id,name,slug,tags,meta,scan_count}, scan:{country,device,outcome}, at}` with header `x-qrforge-signature` = your action secret. Retries: none (fire-and-forget, logged under Workflows → Recent runs).