Anything you can do by hand in the wizard, you can do in code — create codes, list them, pull scan history — plus a signed webhook fired on every scan. Here's what that looks like in practice.
A print shop or agency scripts the whole run — one code per SKU, per event badge, per direct-mail piece — instead of clicking through the wizard by hand for each one.
curl -X POST https://qrfox.io/api/v1/codes \
-H "Authorization: Bearer $QRFOX_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "url",
"fields": { "url": "https://shop.example.com/p/SKU-1042" },
"label": "SKU-1042"
}'
# → { "short_code": "8fK2p1", "destination_url": "...", ... }
Every scan fires a signed webhook to your endpoint — route it into Slack for a live sales-floor alert, or straight into your CRM to log a lead the moment it walks in.
POST https://yourapp.com/webhooks/qrfox
X-QRfox-Signature: sha256=…
{
"event": "scan",
"short_code": "8fK2p1",
"scanned_at": "2026-08-08T14:32:01Z",
"device": "mobile",
"os": "iOS",
"browser": "Safari",
"country": "US",
"referrer": null
}
Agencies pull scan history straight into a white-labeled report instead of handing clients a QRfox login — the branding stays yours end to end.
curl https://qrfox.io/api/v1/codes/8fK2p1/scans \
-H "Authorization: Bearer $QRFOX_KEY"
# → [{ "scanned_at": "...", "device": "mobile",
# "os": "iOS", "browser": "Safari",
# "country": "US" }, …]
Ops teams generate a code per asset tag on intake, list them alongside internal records, and delete the code when a unit is retired — no orphaned labels floating around.
curl https://qrfox.io/api/v1/codes \
-H "Authorization: Bearer $QRFOX_KEY"
curl -X DELETE https://qrfox.io/api/v1/codes/8fK2p1 \
-H "Authorization: Bearer $QRFOX_KEY"