LIVE · AUDIT-KETEN · EU-GEHOST
SYSTEEM · 99,99% UPTIME
v 1.0 ↗ GEMAAKT IN DE EU

Concepten

Wat een Sessie, Bewijs-rij en Audit-keten eigenlijk zijn, in zo weinig mogelijk woorden. Lees dit één keer en de API-referentie wordt logisch.

Organisatie

De tenant op het hoogste niveau. Eén org komt overeen met één klantaccount. Elke andere resource (sessies, bewijs, audit-events, gebruikers) is via row-level security op de onderliggende Postgres-tabellen aan een Org gebonden. Een bug in de applicatiecode kan niet tussen tenants lekken — de database weigert de query.

Een Org heeft: leden (gebruikers met rolgebaseerde toegang), branding (logo / kleuren / PDF-voettekst), een facturatieabonnement, optionele KYB-rechtspersoonsgegevens, optionele SSO-configuratie en een bewaarbeleid.

Lid, Rol, Recht

Een Lidmaatschap is de koppeling tussen een User en een Org. Een gebruiker kan lidmaatschappen in meerdere orgs hebben en daartussen wisselen (de actieve org reist mee als JWT-claim).

Elke Org krijgt bij aanmaak vier systeemrollen:

  • org_admin — volledige controle. Facturatie, leden, branding, retentie.
  • inspector — kan inspecties uitvoeren, bewijs vastleggen, rapporten ondertekenen.
  • observer — alleen-lezen toegang tot sessies + auditgegevens.
  • auditor — alleen-lezen toegang plus recht om de keten te verifiëren.

Org-admins kunnen custom rollen maken door de rechtencatalogus samen te stellen. Rechten worden op slug-niveau gecontroleerd in de view-laag + gekruistcontroleerd door RLS in de DB-laag.

Sessie

Eén inspectie. De facturatie-eenheid (u betaalt per gesloten sessie) en de bewijs-eenheid (een audit-keten is per sessie, niet per org).

Een sessie heeft: een operator (uw teamlid dat de sessie startte), een of meer deelnemers (de veldgebruiker, plus optionele observers), toestemmingsstatus, optionele GPS-positie, optionele notities, een audit-keten en — eenmaal gesloten — TSA-verankerde timestamp-tokens.

Deelnemer

Eén persoon in een sessie. Er is één operator per sessie en minstens één veldgebruiker; optionele extra observers worden ondersteund. Veldgebruikers treden toe via een eenmalige ondertekende URL (geen account vereist); operators + observers zijn lid van de Org.

Bewijs

Een tijdens een sessie vastgelegd bewijsstuk. Soorten:

  • snapshot — stilstaande foto van de camera van de veldgebruiker.
  • annotation — tekening over een snapshot of whiteboard heen.
  • whiteboard — Excalidraw-canvas uit de sessie, geëxporteerd als PNG + state.
  • clip — kort videosegment.
  • document — geüpload bestand (gebruikt door de chatlaag voor PDF-ter-ondertekening).

Elke Evidence-rij heeft een SHA-256 van zijn binaire inhoud, opgeslagen in de audit-keten. Het bestand achteraf manipuleren laat de verificatie mislukken.

Audit-keten

De cryptografische ruggengraat. Elk event in een sessie — sessie-aanmaak, toestemmingverlening, GPS-registratie, bewijsvastlegging, annotatie, whiteboard-opslag, handtekening, sessie-einde — genereert een AuditEvent -rij met:

{
  "session": "<uuid>",
  "sequence": N,
  "occurred_at": "<iso8601>",
  "kind": "evidence.snapshot_added",
  "actor": { "user": <id|null>, "participant": <id|null> },
  "payload": { /* event-specific */ },
  "prev_hash": "<sha256 of previous event>",
  "hash": "<sha256 of canonical_json of this event>"
}

Het eerste event gebruikt prev_hash = "0" * 64 (genesis). Elk volgend event gebruikt de hash van het vorige event als prev_hash en verhoogt sequence met 1. Een Postgres advisory lock serialiseert de schrijfbewerkingen per sessie; een append-only trigger blokkeert UPDATE + DELETE op de tabel.

TimestampToken (TSA-anker)

Bij sessie-einde (en bij een door de operator geactiveerde "stamp now") wordt de huidige ketenkop ingediend bij drie onafhankelijke tijdstempelautoriteiten:

  • YodaLedger — Anker op de Tezos-blockchain. Finaliteit ~15-20 minuten. Asynchroon; we krijgen een callback wanneer het blok is bevestigd.
  • FreeTSA — RFC 3161-tijdstempel. Synchroon; token wordt direct geretourneerd. Verwisselbaar voor een betaalde QTSP (DataSure) voor conformiteit met eIDAS Art. 42.
  • OpenTimestamps — Bitcoin-anker via het OpenTimestamps-kalenderprotocol. Asynchroon; het upgradepad draait op een Celery-sweep.

Drie is bewust gekozen — als één TSA verdwijnt, verankeren de andere twee de keten nog steeds. Een auditor kan onafhankelijk tegen elk van hen verifiëren met publieke block explorers / verificatie-endpoints.

Handtekening (SES / AES / QES)

Drie eIDAS-niveaus, allemaal op hetzelfde audit-rapport-PDF:

  • SES (Eenvoudige Elektronische Handtekening) — onderbouwd door de audit-keten, geen ondertekeningscertificaat. Geschikt voor interne dossiers.
  • AES (Geavanceerde Elektronische Handtekening) — identiteitsgebonden ondertekeningscertificaat, PAdES B-T-verankerd. Geschikt voor de meeste B2B-contracten.
  • QES (Gekwalificeerde Elektronische Handtekening) — hoogste eIDAS-niveau, juridisch gelijk aan een handgeschreven handtekening in de gehele EU. Afgeschermd achter KYB-verificatie van de uitgevende organisatie.

Campagne (optioneel)

Een logische groepering van sessies voor gebundelde rapportage — "Q2 2026 autoschades" of "Locatie A opleveringsgebreken". Sessies vereisen geen campagne; het is een rapportagehulpmiddel.

Webhook

Een door de klant geregistreerde URL die HMAC-ondertekende event-POSTs ontvangt. Event-typen: session.created, session.completed, participant.joined, participant.left, evidence.added, recording.ready, audit.anchored, signature.completed, plus een webhook.test voor afleveringsverificatie.

Handtekening: Stripe-stijl t=...,v1=... header met HMAC-SHA256 over <timestamp>.<body>. De constructEvent() -helper van de SDK verifieert in constante tijd met een klokafwijkingstolerantie van 5 minuten.