Preskočiť na obsah

Webhooks

Webhooks

S webhookmi prijímate upozornenia v reálnom čase, keď vo vašom workspace nastanú udalosti — napr. keď sa naskenuje QR kód.

Vytvorenie webhooku

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

Odpoveď

{
"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"
}

Typy udalostí

UdalosťPopis
*Všetky udalosti
qr.createdQR kód vytvorený
qr.updatedQR kód aktualizovaný (URL, stav, tagy)
qr.deletedQR kód vymazaný
qr.scannedQR kód naskenovaný
qr.flaggedQR kód označený ako nebezpečný
scan.createdUdalosť skenovania (alias pre qr.scanned)
workspace.updatedWorkspace aktualizovaný
webhook.pingTestovací ping (cez endpoint /ping)

Formát payloadu

Všetky payloady webhookov majú tento formát:

{
"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"
}
}

Overenie podpisu

qr3.app podpisuje každú požiadavku webhooku pomocou HMAC-SHA256:

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

Implementácia overenia

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 });
});

Logika opakovaných pokusov

Pri chybách (HTTP >= 300 alebo vypršaní časového limitu) sa qr3.app pokúsi o doručenie znova:

PokusOneskorenie
1Okamžite
21 minúta
35 minút

Po 10 po sebe nasledujúcich chybách sa webhook automaticky deaktivuje.

Záznamy o doručení

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"
}
]
}

Testovací ping

Otestujte webhook okamžite:

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

Týmto sa odošle udalosť webhook.ping na adresu URL vášho endpointu.