Pređi na glavni sadržaj

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đajOpis
consent.createdKreiran je novi zapis o saglasnosti
consent.updatedRezervisan. Trenutno se ne šalje
consent.revokedRezervisan. Trenutno se ne šalje
consent.expiredSaglasnosti su istekle (dnevna provera u 02:00 CET)
dsar.createdPodnet je zahtev za pristup podacima
scan.completedSkeniranje kolačića je završeno
webhook.testTest 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 2xx u 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:

ZaglavljeOpis
X-OptSens-Signaturev1=<hex digest>
X-OptSens-TimestampUnix vreme (sekunde) potpisivanja
X-OptSens-EventTip događaja
Content-Typeapplication/json
User-AgentOptSens-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šajRazmakUkupno proteklo
1Odmah0
21 minut1 minut
35 minuta6 minuta
430 minuta36 minuta
52 sata2 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.