Skip to content

Webhooks

Webhooks

Pomoću webhooka primate obavijesti u stvarnom vremenu kada se dogode događaji u vašem radnom prostoru — npr. kada se skenira QR kod.

Izrada webhooka

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

Odgovor

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

Vrste događaja

DogađajOpis
*Svi događaji
qr.createdQR kod je kreiran
qr.updatedQR kod je ažuriran (URL, status, oznake)
qr.deletedQR kod je obrisan
qr.scannedQR kod je skeniran
qr.flaggedQR kod je označen kao nesiguran
scan.createdDogađaj skeniranja (alias za qr.scanned)
workspace.updatedRadni prostor je ažuriran
webhook.pingTestni ping (putem /ping krajnje točke)

Format payload-a

Svi webhook payload-i imaju ovaj 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"
}
}

Verifikacija potpisa

qr3.app potpisuje svaki webhook zahtjev pomoću HMAC-SHA256:

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

Implementacija verifikacije

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 ponovnog pokušaja

U slučaju pogrešaka (HTTP >= 300 oder Timeout), qr3.app ponovno pokušava dostavu:

PokušajOdgoda
1Odmah
21 minuta
35 minuta

Nakon 10 uzastopnih pogrešaka, webhook se automatski deaktivira.

Zapisi o dostavi

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

Testni ping

Odmah testirajte webhook:

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

To šalje webhook.ping događaj na URL vaše krajnje točke.