Konsepter
Hva en økt, bevisrad og audit-kjede faktisk er, med færrest mulig ord. Les dette én gang, så vil API-referansen gi mening.
Organisasjon
Toppnivå-tenanten. Én org tilsvarer én kundekonto. Alle andre ressurser (økter, bevis, audit-hendelser, brukere) er scopet til en Org via rad-nivå-sikkerhet på de underliggende Postgres-tabellene. En feil i applikasjonskoden kan ikke krysse tenanter — databasen vil avvise spørringen.
En Org har: medlemmer (brukere med rollebasert tilgang), merkevare (logo / farger / PDF-bunntekst), et faktureringsabonnement, valgfrie KYB-juridisk-enhet-data, valgfri SSO-konfigurasjon og en lagringspolicy.
Medlem, Rolle, Tillatelse
En Medlemskap er koblingen mellom en Bruker og en Org. En bruker kan ha medlemskap i flere orger og bytte mellom dem (den aktive orgen følger med som et JWT-claim).
Hver Org seeder fire systemroller ved opprettelse:
org_admin— full kontroll. Fakturering, medlemmer, merkevare, lagring.inspector— kan kjøre inspeksjoner, fange bevis, signere rapporter.observer— skrivebeskyttet tilgang til økter + audit-data.auditor— skrivebeskyttet tilgang pluss tillatelse til kjede-verifisering.
Org-administratorer kan opprette egendefinerte roller ved å sette sammen tillatelseskatalogen. Tillatelser slug-sjekkes på view-laget + kryss-sjekkes av RLS på DB-laget.
Økt
Én inspeksjon. Enheten for fakturering (du betaler per lukket økt) og enheten for bevis (en audit-kjede er per økt, ikke per org).
En økt har: en operatør (teammedlemmet ditt som startet den), én eller flere deltakere (feltbrukeren, pluss valgfrie observatører), samtykketilstand, valgfri GPS-posisjon, valgfrie notater, en audit-kjede, og — når lukket — TSA-forankrede tidsstempeltokens.
Deltaker
Én person i en økt. Det er én operatør per økt og minst én feltbruker; valgfrie ekstra observatører støttes. Feltbrukere blir med via en engangs-signert URL (ingen konto kreves); operatører + observatører er medlemmer av Orgen.
Bevis
Et stykke fanget bevis under en økt. Typer:
snapshot— stillbilde fra feltbrukerens kamera.annotation— tegning lagt oppå et øyeblikksbilde eller en tavle.whiteboard— Excalidraw-lerret i økten eksportert som PNG + tilstand.clip— kort videosegment.document— opplastet fil (brukt av chat-laget for PDF-for-signering).
Hver bevisrad har en SHA-256 av sitt binære innhold, lagret i audit-kjeden. Manipulering av filen i etterkant feiler verifiseringen.
Audit-kjede
Den kryptografiske ryggraden. Hver hendelse i en økt — øktopprettelse, samtykkegiving, GPS-registrering, bevisfangst, annotering, tavle-lagring, signatur, øktslutt — utsteder en AuditEvent -rad med:
{
"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>"
} Den første hendelsen bruker prev_hash = "0" * 64 (genesis). Hver påfølgende hendelse bruker forrige hendelses hash som prev_hash og øker sequence med 1. En Postgres advisory lock serialiserer skrivinger per økt; en append-only-trigger blokkerer UPDATE + DELETE på tabellen.
TimestampToken (TSA-anker)
Ved øktslutt (og ved operatørutløst "stamp now") sendes det gjeldende kjedehodet til tre uavhengige tidsstemplingsmyndigheter:
- YodaLedger — Tezos blockchain-anker. ~15-20 minutters finalitet. Asynkron; vi får et callback når blokken er bekreftet.
- FreeTSA — RFC 3161-tidsstempel. Synkron; token returneres umiddelbart. Byttbar til en betalt QTSP (DataSure) for eIDAS Art. 42-compliance.
- OpenTimestamps — Bitcoin-anker via OpenTimestamps kalenderprotokoll. Asynkron; oppgraderingsstien kjører på en Celery-sweep.
Tre er med hensikt — hvis én TSA forsvinner, forankrer de to andre fortsatt kjeden. En revisor kan verifisere mot hvilken som helst av dem uavhengig ved hjelp av offentlige block explorers / verifiseringsendepunkter.
Signatur (SES / AES / QES)
Tre eIDAS-nivåer, alle på den samme audit-rapport-PDF-en:
- SES (Simple Electronic Signature) — audit-kjede-støttet, ingen signeringssertifikat. Egnet for interne opptegnelser.
- AES (Advanced Electronic Signature) — identitetsbundet signeringssertifikat, PAdES B-T-forankret. Egnet for de fleste B2B-kontrakter.
- QES (Qualified Electronic Signature) — høyeste eIDAS-nivå, juridisk ekvivalent til en håndskrevet signatur i hele EU. Åpnes bak KYB-verifisering av den utstedende organisasjonen.
Kampanje (valgfritt)
En logisk gruppering av økter for samlet rapportering — "Q2 2026 motorskader" eller "Sted A overleveringsmangler". Økter krever ikke en kampanje; det er en rapporteringsbekvemmelighet.
Webhook
En kunderegistrert URL som mottar HMAC-signerte hendelses-POST-er. Hendelsestyper: session.created, session.completed,
participant.joined, participant.left,
evidence.added, recording.ready,
audit.anchored, signature.completed, pluss en webhook.test for leveringsverifisering.
Signatur: Stripe-stil t=...,v1=... -header med HMAC-SHA256 over <timestamp>.<body>. SDK-ens constructEvent() -hjelper verifiserer i konstant tid med en 5-minutters klokke-avvik-toleranse.