Skip to content

Webhooks

Webhooks

B’Webhooks tirċievi notifikazzjonijiet f’ħin reali meta jseħħu avvenimenti fil-Workspace tiegħek — eż. meta jiġi skannjat QR-Code.

Ħolqien ta’ Webhook

Terminal window
POST /v1/webhooks
{
"url": "https://example.com/webhooks/qr3",
"events": ["qr.scanned", "qr.created"],
"secret": "my-secret-key-min-16-chars"
}

Rispons

{
"id": "wh_abc123",
"url": "https://example.com/webhooks/qr3",
"events": ["qr.scanned", "qr.created"],
"is_active": true,
"secret": "my-secret-key-min-16-chars",
"secret_hint": "my-s…",
"created_at": "2026-03-15T10:00:00.000Z"
}

Tipi ta’ Avvenimenti

EventDeskrizzjoni
*L-avvenimenti kollha
qr.createdQR-Code maħluq
qr.updatedQR-Code aġġornat (URL, status, tags)
qr.deletedQR-Code imħassar
qr.scannedQR-Code skannjat
qr.flaggedQR-Code mmarkat bħala mhux sigur
scan.createdAvveniment ta’ skan (alias għal qr.scanned)
workspace.updatedWorkspace aġġornat
webhook.pingPing tat-test (permezz tal-endpoint /ping)

Format tal-Payload

Il-payloads kollha tal-Webhook għandhom dan il-format:

{
"id": "evt_abc123xyz",
"type": "qr.scanned",
"created": "2026-03-15T10:00:00.000Z",
"data": {
"code_id": "qr_abc123",
"short_code": "r7f3Kx",
"scan_id": "scn_xyz",
"country": "AT",
"device_type": "mobile",
"os": "iOS"
}
}

Verifika tal-Firma

qr3.app jiffirma kull talba (request) ta’ Webhook b’HMAC-SHA256:

X-QR3-Signature: sha256=a1b2c3d4e5f6...

Implimenta l-Verifika

import crypto from "crypto";
function verifySignature(
payload: string,
signature: string,
secret: string
): boolean {
const expected = crypto
.createHmac("sha256", secret)
.update(payload)
.digest("hex");
const received = signature.replace("sha256=", "");
return crypto.timingSafeEqual(
Buffer.from(expected, "hex"),
Buffer.from(received, "hex")
);
}
// In Express:
app.post("/webhooks/qr3", (req, res) => {
const signature = req.headers["x-qr3-signature"] as string;
const valid = verifySignature(
JSON.stringify(req.body),
signature,
process.env.QR3_WEBHOOK_SECRET
);
if (!valid) return res.status(401).json({ error: "Invalid signature" });
const event = req.body;
console.log(event.type, event.data);
res.json({ received: true });
});

Loġika ta’ Retry

F’każ ta’ żbalji (HTTP >= 300 jew timeout), qr3.app jipprova jerġa’ jibgħat il-kunsinna:

ProvaDewmien
1Minnufih
2Minuta
35 minuti

Wara 10 żbalji konsekuttivi, il-Webhook jiġi ddiżattivat awtomatikament.

Logs tal-Kunsinna

Terminal window
GET /v1/webhooks/:id/deliveries
{
"data": [
{
"id": "whd_abc123",
"event_type": "qr.scanned",
"status": "success",
"status_code": 200,
"response_time_ms": 145,
"attempt": 1,
"created_at": "2026-03-15T10:00:00.000Z"
}
]
}

Ping tat-Test

Ittestja Webhook minnufih:

Terminal window
POST /v1/webhooks/:id/ping

Dan jibgħat avveniment webhook.ping lill-URL tal-endpoint tiegħek.