Evidence API
En Evidence-række er ét artefakt registreret under en session — et snapshot, et whiteboard, et videoklip, en optagelse eller et uploadet dokument. Hver række bærer en sha256 + byte_size + mime så integritetsverifikationskæden kan bevise, at bytes ikke blev manipuleret mellem registrering og audit.
Evidence-objektet
{
"id": "ev-7f3a...",
"session": "0c8f4d2e-1a3b-4c5d-9e7f-1234567890ab",
"kind": "snapshot",
"status": "ready",
"mime": "image/jpeg",
"byte_size": 184523,
"sha256": "f9cc12fda76c30dcc9bee627baed6c9e8fe11b813313de70b1463f9f73e5e418",
"captured_at": "2026-05-23T10:14:02.481Z",
"created_at": "2026-05-23T10:14:02.917Z",
"completed_at": "2026-05-23T10:14:03.211Z"
} Typer
| Art | Registreret af | Noter |
|---|---|---|
snapshot | Operatør eller feltside | Enkelt stillbillede (JPEG). Den mest almindelige type. |
whiteboard | Operatør | Excalidraw-eksport — PNG + kanonisk JSON. Se Whiteboards. |
clip | Operatør | Kort MP4 klippet fra live-sessionen — bruges til at fange bevægelse, som feltbrugeren demonstrerer. |
recording | System | Fuld sessionsoptagelse. Efterbehandlet til libx264 medium / crf20 efter sessionen slutter. |
document | Operatør | Filvedhæftning fra chatten i sessionen (PDF'er, fotos osv.). Fundament for PDF-til-underskrift. |
Status
| Status | Betydning |
|---|---|
pending | Række oprettet; bytes endnu ikke i object storage. |
uploading | Multipart-upload i gang. |
ready | Bytes er persisteret; sha256 + byte_size er færdiggjort. Kun ready rækker kan downloades. |
failed | Registrering eller upload afbrudt. completed_at er null. |
List session-beviser
GET /api/v1/public/sessions/{session_id}/evidence — scope evidence:read
curl "https://app.nexbasira.com/api/v1/public/sessions/0c8f.../evidence?kind=snapshot&limit=50" \
-H "Authorization: Bearer nb_sec_..." Query-parametre
| Parameter | Type | Noter |
|---|---|---|
kind | string | Filter — en af snapshot, whiteboard, clip, recording, document. |
limit | int | Maks. 100. Standard 25. |
cursor | opaque | Fra det forrige svars next_cursor. |
Hent en signeret download-URL
GET /api/v1/public/evidence/{evidence_id}/download — scope evidence:read
Returnerer en kortlivet presigned URL, som kunden henter de rå bytes fra. URL'en peger direkte på object-storage-backenden, så downloads omgår vores app-servere — ingen bandwidth-egress-gebyrer fra din ende af det offentlige API.
curl "https://app.nexbasira.com/api/v1/public/evidence/ev-7f3a.../download" \
-H "Authorization: Bearer nb_sec_..." {
"url": "https://s3.eu-central-1.amazonaws.com/nb-prod-evidence/orgs/.../snapshot.jpg?X-Amz-Algorithm=...",
"expires_in_seconds": 900,
"sha256": "f9cc12fda76c30dcc9bee627baed6c9e8fe11b813313de70b1463f9f73e5e418",
"byte_size": 184523,
"mime": "image/jpeg",
"kind": "snapshot"
} Kald igen, når URL'en udløber — ingen rate-limit-straf for gentagne genereringer. Efter download, hash bytes med SHA-256 og sammenlign med den returnerede sha256 for at verificere, at filen er intakt end-to-end.
# integrity check — Python
import hashlib, requests
r = requests.get(presigned["url"]); r.raise_for_status()
assert hashlib.sha256(r.content).hexdigest() == presigned["sha256"] Almindelige fejl
| Status | Kode | Hvornår |
|---|---|---|
| 403 | permission_denied | Credential mangler evidence:read. |
| 404 | not_found | Bevisrækken findes ikke i credentialens org. |
| 409 | evidence_not_ready | Download anmodet på en række, hvis status ikke er ready. |
| 410 | retention_expired | Org'ens opbevaringspolitik har passeret rækkens aldersgrænse; bytes er blevet slettet fra object storage. |
Noter
- Ingen POST/PATCH/DELETE. Beviser registreres client-side (operatør- + felt-SPA) under sessionen. Det offentlige API er skrivebeskyttet på denne ressource.
- Opbevaring. Hver org konfigurerer et opbevaringsvindue (standard 7 år for eIDAS-kompatible deployments). Efter vinduet sletter object-storage lifecycle-regler bytes; rækken bliver, så audit-kæden ikke brydes, men
/downloadreturnerer 410. - Forankret i audit-kæden. Hver
readyrække bidrager med sin sha256 til den sessionsspecifikke hashkæde, som forankres hos TSA'en ved sessionens afslutning. Kædehovedet + TSA-kvitteringen er tilgængelige via SPA-sidens audit-verify-endpoint.