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
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.
Attach knowledge
Link the articles and folders that are specific to this QR code. Visitors who scan it get them on top of the chatbot’s own knowledge, so a question like “how do I turn the TV on?” is answered from this QR code’s manual, not a guess across every one. The{id} accepts the public slug. Both arrays are replace-only: send the full desired set every time.
Webhook events
Subscribe and verify signatures per the webhooks guide.

