Webhook-ovi
Webhook-ovi isporučuju HTTP POST obaveštenja na vaš endpoint u realnom vremenu kada se na domenu dogodi neki događaj. Webhook-ove kreirate i održavate u kontrolnoj tabli pod API i webhook-ovi, na kartici Webhooks (do 5 webhook-a po domenu).
Tipovi događaja
| Događaj | Opis |
|---|---|
consent.created | Kreiran je novi zapis o saglasnosti |
consent.updated | Rezervisan. Trenutno se ne šalje |
consent.revoked | Rezervisan. Trenutno se ne šalje |
consent.expired | Saglasnosti su istekle (dnevna provera u 02:00 CET) |
dsar.created | Podnet je zahtev za pristup podacima |
scan.completed | Skeniranje kolačića je završeno |
webhook.test | Test događaj poslat iz kontrolne table |
Zahtevi za endpoint
- HTTPS adresa, do 2048 karaktera.
- Javna adresa: localhost, privatni IP opsezi i interni hostovi se odbijaju.
- Odgovorite statusom
2xxu roku od 10 sekundi da potvrdite isporuku.
Format sadržaja
Svaka isporuka ima ovu strukturu:
{
"event": "consent.created",
"timestamp": "2026-04-07T14:30:00.000Z",
"data": {
// event-specific data
}
}
Primer consent.expired sadržaja (lista posetilaca ograničena na 100
po isporuci):
{
"event": "consent.expired",
"timestamp": "2026-04-07T02:00:05.000Z",
"data": {
"expired_count": 42,
"visitors": [
"a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"b2c3d4e5-f6a7-8901-bcde-f12345678901"
],
"period": {
"from": "2026-04-06T02:00:00.000Z",
"to": "2026-04-07T02:00:05.000Z"
}
}
}
Provera potpisa
Svaka isporuka je potpisana HMAC-SHA256 algoritmom vašim webhook tajnim ključem. Ključ se prikazuje jednom pri kreiranju webhook-a i može da se regeneriše u kontrolnoj tabli.
Zaglavlja koja stižu uz svaku isporuku:
| Zaglavlje | Opis |
|---|---|
X-OptSens-Signature | v1=<hex digest> |
X-OptSens-Timestamp | Unix vreme (sekunde) potpisivanja |
X-OptSens-Event | Tip događaja |
Content-Type | application/json |
User-Agent | OptSens-Webhook/1.0 |
Potpis se računa kao
HMAC-SHA256(secret, "{timestamp}.{json_body}").
Proveravajte u odnosu na sirovi sadržaj zahteva, tačno onakav kakav je primljen. Ponovna serijalizacija parsiranog JSON-a može proizvesti drugačije bajtove i provera neće uspeti.
const crypto = require('crypto');
const express = require('express');
const app = express();
// Keep the raw bytes: the signature covers the body exactly as sent.
app.use(express.json({
verify: (req, res, buf) => { req.rawBody = buf.toString(); },
}));
function verifyWebhook(secret, signature, timestamp, body) {
const expected = crypto
.createHmac('sha256', secret)
.update(`${timestamp}.${body}`)
.digest('hex');
return signature === `v1=${expected}`;
}
app.post('/webhooks/optsens', (req, res) => {
const sig = req.headers['x-optsens-signature'];
const ts = req.headers['x-optsens-timestamp'];
if (verifyWebhook(WEBHOOK_SECRET, sig, ts, req.rawBody)) {
// signature valid: process req.body
res.sendStatus(200);
} else {
// reject: tampered payload or wrong secret
res.sendStatus(401);
}
});
Odbijajte isporuke čije je vreme daleko u prošlosti, radi zaštite od ponavljanja.
Ponovni pokušaji
Neuspele isporuke (status koji nije 2xx ili istek vremena) ponavljaju se sa rastućim razmacima:
| Pokušaj | Razmak | Ukupno proteklo |
|---|---|---|
| 1 | Odmah | 0 |
| 2 | 1 minut | 1 minut |
| 3 | 5 minuta | 6 minuta |
| 4 | 30 minuta | 36 minuta |
| 5 | 2 sata | 2 sata i 36 minuta |
Posle 5 neuspelih pokušaja isporuka se napušta.
Automatsko isključivanje i dnevnik isporuka
- Webhook koji nakupi 50 uzastopnih grešaka automatski se isključuje. Svaka uspešna isporuka resetuje brojač, a ponovno uključivanje iz kontrolne table takođe.
- Dnevnik isporuka (status, odgovor, pokušaji) vidljiv je u kontrolnoj tabli i čuva se 30 dana.