https://award.ee/<slug> paired with a programmable destination, a status, and an immutable scan history. Print the code once, change where it sends visitors any time.
The scan flow
Two things matter for integrations:- Destination at scan time, not print time. The row stored on the scan captures the destination as it was at the moment of resolution. Change the destination tomorrow and tomorrow’s scans go somewhere else — yesterday’s history stays accurate.
- URL params merge. Static params from
qr_codes/{id}/url-params(and any inherited from the QR group) get appended to the redirect. Live query string params from the visitor override on key collision.
The id parameter accepts slugs too
Every endpoint that takes {id} accepts either the UUID or the public_slug. Useful when you only know the short slug from a scan URL:
Status lifecycle
| Status | Meaning |
|---|---|
unconfigured | No destination set. Scans show a “not configured” screen. |
active | Live. Scans resolve and redirect. |
inactive | Paused. Row stays, scans show a “paused” screen. Useful for recall, seasonal pulls, A/B holds. |
archived | Soft-deleted. Hidden from list views. Historical scans still readable. |
Sub-resources
Properties
Operator-defined K/V metadata on the code. Used for internal labels — venue, batch, ad campaign, etc. Replaced as a set via
PUT.URL params
Static query params merged into the redirect URL. Common use:
utm_source, utm_medium, ref. Live visitor params override on key collision.Scans
Immutable scan history. Cursor-paginated. Each row captures the destination at scan time, the visitor’s user agent, coarse geo (country / region / city), and the merged query params.
URL param merge example
A QR code has static paramsutm_source=poster&utm_campaign=fall24. The visitor scans https://award.ee/abc1234?utm_source=email. The merged params on the redirect become:
utm_source; the static utm_campaign survives.
Webhook events
| Event | Fires on |
|---|---|
qr_code.updated | PATCH /qr-codes/{id} or any dashboard edit. |
qr_code.scanned | A visitor scanned the short URL and was successfully redirected. |

