Przejdź do głównej zawartości

Webhooki

Webhooki

Dzięki webhookom otrzymujesz powiadomienia w czasie rzeczywistym, gdy w Twoim Workspace wystąpią zdarzenia — np. gdy kod QR zostanie zeskanowany.

Tworzenie webhooka

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

Odpowiedź

{
"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 zdarzeń

ZdarzenieOpis
*Wszystkie zdarzenia
qr.createdKod QR został utworzony
qr.updatedKod QR został zaktualizowany (URL, status, tagi)
qr.deletedKod QR został usunięty
qr.scannedKod QR został zeskanowany
qr.flaggedKod QR został oznaczony jako niebezpieczny
scan.createdZdarzenie skanowania (alias dla qr.scanned)
workspace.updatedWorkspace został zaktualizowany
webhook.pingPing testowy (przez punkt końcowy /ping)

Format payloadu

Wszystkie payloady webhooków mają następujący 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"
}
}

Weryfikacja sygnatury

qr3.app podpisuje każde żądanie webhooka za pomocą HMAC-SHA256:

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

Implementacja weryfikacji

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 ponownych prób

W przypadku błędów (HTTP >= 300 lub limit czasu) qr3.app ponowi próbę dostarczenia:

PróbaOpóźnienie
1Natychmiast
21 minuta
35 minut

Po 10 kolejnych błędach webhook zostanie automatycznie wyłączony.

Logi dostarczeń

Okno terminala
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 testowy

Przetestuj webhook natychmiast:

Okno terminala
POST /v1/webhooks/:id/ping

Spowoduje to wysłanie zdarzenia webhook.ping na Twój adres URL punktu końcowego.