Přeskočit na obsah

Webhooks

Webhooks

Pomocí webhooků přijímáte upozornění v reálném čase, když v rámci vašeho workspace dojde k událostem — např. při naskenování QR kódu.

Vytvoření webhooku

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

Odpověď

{
"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 událostí

UdálostPopis
*Všechny události
qr.createdQR kód vytvořen
qr.updatedQR kód aktualizován (URL, stav, tagy)
qr.deletedQR kód smazán
qr.scannedQR kód naskenován
qr.flaggedQR kód označen jako nebezpečný
scan.createdUdálost naskenování (alias pro qr.scanned)
workspace.updatedWorkspace aktualizován
webhook.pingTestovací ping (přes endpoint /ping)

Formát payloadu

Všechny payloady webhooků 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"
}
}

Ověření podpisu

qr3.app podepisuje každý požadavek webhooku pomocí HMAC-SHA256:

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

Implementace ověření

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 opakování

V případě chyb (HTTP >= 300 nebo timeout) se qr3.app pokusí o doručení znovu:

PokusZpoždění
1Okamžitě
21 minuta
35 minut

Po 10 po sobě jdoucích chybách bude webhook automaticky deaktivován.

Logy doručení

Terminál
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žitě:

Terminál
POST /v1/webhooks/:id/ping

Tím se odešle událost webhook.ping na URL adresu vašeho endpointu.