Skip to main content

Webhooks

QRlumo can push scan events and code lifecycle changes to any HTTPS endpoint in real time — no polling required.

Setting up a webhook

  1. Go to Workspace → Settings → Webhooks
  2. Click Add endpoint
  3. Enter your HTTPS URL
  4. Select the event types you want to receive
  5. Save — QRlumo sends a test ping immediately

Event types

EventTrigger
qrcode.scannedA QR code is scanned
qrcode.createdA new code is created
qrcode.updatedA code's destination or settings change
qrcode.deletedA code is deleted
workspace.member_addedA team member joins the workspace

Payload format

All events share a common envelope:

{
"id": "evt_abc123",
"event": "qrcode.scanned",
"createdAt": "2026-06-10T10:00:00Z",
"workspaceId": "ws_xyz",
"data": { ... }
}

qrcode.scanned payload

{
"id": "evt_abc123",
"event": "qrcode.scanned",
"createdAt": "2026-06-10T10:00:00Z",
"workspaceId": "ws_xyz",
"data": {
"qrcodeId": "qr_789",
"qrcodeName": "spring_packaging",
"scannedAt": "2026-06-10T09:59:58Z",
"country": "CN",
"device": "iOS",
"browser": "Safari",
"ip": "203.0.113.5",
"referrer": null
}
}

Verifying signatures

Every request includes a X-QRlumo-Signature header — an HMAC-SHA256 digest of the raw request body, signed with your endpoint's secret.

import crypto from 'crypto';

function verifySignature(
payload: string,
signature: string,
secret: string
): boolean {
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(`sha256=${expected}`)
);
}

Always verify the signature before processing a webhook payload.

Retry policy

QRlumo expects a 2xx response within 10 seconds. If the endpoint times out or returns a non-2xx status, QRlumo retries with exponential back-off:

AttemptDelay
1Immediate
21 minute
310 minutes
41 hour
524 hours

After 5 failed attempts, the event is marked as failed and delivery stops. Failed events are visible in the webhook dashboard.

Webhook limits by plan

PlanEndpointsEvents / month
Free35,000
Pro1050,000
Team50500,000
Business200Unlimited