Skip to content

Webhooks

Webhooks

Naudodami webhooks, gausite realaus laiko pranešimus, kai jūsų Workspace įvyksta įvykiai – pvz., kai nuskaitomas QR kodas.

Webhook kūrimas

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

Atsakymas

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

Įvykių tipai

ĮvykisAprašymas
*Visi įvykiai
qr.createdQR kodas sukurtas
qr.updatedQR kodas atnaujintas (URL, būsena, žymos)
qr.deletedQR kodas ištrintas
qr.scannedQR kodas nuskaitytas
qr.flaggedQR kodas pažymėtas kaip nesaugus
scan.createdNuskaitymo įvykis (alias įvykiui qr.scanned)
workspace.updatedWorkspace atnaujinta
webhook.pingBandomasis ping (per /ping galinį tašką)

Payload formatas

Visi webhook payload duomenys yra šio formato:

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

Parašo verifikavimas

qr3.app pasirašo kiekvieną webhook užklausą naudodama HMAC-SHA256:

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

Verifikavimo įgyvendinimas

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

Pakartotinių bandymų logika

Klaidų atveju (HTTP >= 300 arba laiko viršijimas) qr3.app bandys pristatyti iš naujo:

BandymasDelsa (Delay)
1Iškart
21 minutė
35 minutės

Po 10 nesėkmingų bandymų iš eilės webhook bus automatiškai deaktyvuotas.

Pristatymo žurnalai

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

Testinis ping

Išbandykite webhook iškart:

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

Tai išsiųs webhook.ping įvykį į jūsų galinio taško (endpoint) URL.