Autentificering
RefiLog bruger OTP-baseret (engangskode) autentificering. Der er ingen API-nøgler, alle kald autentificeres via en session_token cookie der sættes ved login.
Superadmin → Admin → Tekniker → Ejer → Inspektør → Gæst. Hvert endpoint kræver en minimumsrolle.
Alle API-endpoints er rate-limiteret (120 req/min pr. IP). Auth-endpoints har strengere grænser. Backed af Redis.
Sikkerhed
API'et er beskyttet med flere lag af sikkerhed for at beskytte kundernes data.
Alle muterende requests (POST/PATCH/PUT/DELETE) kræver gyldig Origin eller Referer header fra godkendte domæner.
Hvert firma kan kun se eget udstyr og egne data. Ejere ser kun deres eget udstyr. Gæster er scopet til ét anlæg.
CSP, HSTS, X-Frame-Options: DENY, nosniff, Permissions-Policy. TLS enforced via Let's Encrypt.
Alle ændringer logges med bruger, firma, IP og tidspunkt. GDPR-kompatibel med automatisk anonymisering.
Autentificering
OTP-baseret login, session-håndtering og gæsteadgang.
POST/api/auth/otp
Send en 8-cifret engangskode til brugerens email.
{ email: string }{ success: true }POST/api/auth/verify
Verificér OTP-kode og opret session. Sætter session_token cookie.
{ email: string, code: string }{ success: true, userId: string }GET/api/auth/session
Returnér aktuel bruger eller gæsteadgang-info.
{ authenticated: true, user: { id, name, email, role, company } }DELETE/api/auth/session
Log ud: sletter session_token cookie.
{ success: true }POST/api/auth/guest
Opret midlertidig gæstesession (4 timer) til at se udstyrshistorik.
{ email: string, equipmentId: string }{ success: true }Registrering & CVR
Firma-registrering via CVR-opslag og auto-godkendelse.
POST/api/register
Registrér firma via CVR. Auto-godkender VVS, bygningsinstallation og ingeniørfirmaer.
{ cvr: string, companyName, branchCode, branchText, contactName, contactEmail, contactPhone? }{ success: true, companyId, status, autoApproved: boolean }GET/api/cvr
Slå firma op i det danske CVR-register.
?cvr=12345678{ cvr, name, address, branchCode, autoApproved }Udstyr
CRUD for køle- og trykanlæg, QR-koder, AI-udtræk og compliance.
GET/api/equipment
List udstyr for brugerens firma med paginering og søgning.
?page=1&limit=25&search=...{ equipment: [...], pagination: { page, limit, total, pages } }POST/api/equipment
Opret udstyr med auto-genereret QR-kode. Kan inkludere billeder af eksisterende papir-logbog.
{ serial, equipmentType, manufacturer, model, refrigerant?, chargeKg?, location, address?, ... }{ equipment, qrCode, photoUrls }GET/api/equipment/:id
Hent enkelt udstyr med de seneste 50 journalposter.
{ equipment: { ..., entries: [...] } }PATCH/api/equipment/:id
Opdatér udstyr, godkend/afvis, eller tilknyt datablad.
{ manufacturer?, model?, refrigerant?, ... } eller { action: "approve" }{ equipment }POST/api/equipment/qr-print
Generér QR-kode data-URLs til batch-print af labels. Kun RefiLog trykker mærkater, partnere bestiller via /api/stickers.
{ equipmentIds: string[] (maks 100) }{ equipment: [{ id, serial, qrCode, qrDataUrl, ... }] }GET/api/equipment/:id/compliance
Beregn regulatorisk compliance-status (EU 2024/573 F-gas, BEK 498, PED).
{ compliance: { leakCheck, inspection, co2eqFormatted, warnings, overallStatus } }GET/api/equipment/:id/pdf
Generér PDF-rapport med udstyrsdata, compliance og journalhistorik.
PDF-fil (Content-Disposition: attachment)Trykbeholdere (PED)
Registrering og kontrol af trykbærende udstyr efter PED-direktivet.
GET/api/equipment/:id/vessels
List trykbeholdere inkl. seneste inspektionshistorik.
[{ serial, vesselType, volumeLiters, designPressureBar, pedCategory, inspections }]POST/api/equipment/:id/vessels
Registrér trykbeholder med fulde tekniske specifikationer.
{ serial, vesselType, volumeLiters?, designPressureBar?, pedCategory?, ... }Vessel-objekt (201)GET/api/equipment/:id/inspections
List kontroller (opstilling, periodisk, beholder, trykprøvning). Kan filtreres på type/beholder.
?type=periodisk_enhedskontrol&vesselId=...[{ type, inspectionDate, result, nextDueDate, inspectorName, inspectorOrg, certificateNo }]POST/api/equipment/:id/inspections
Opret kontrolrapport. Kræver inspektørdetaljer og næste kontroldato.
{ vesselId?, type, inspectionDate, result, nextDueDate, inspectorName, inspectorOrg, certificateNo }Inspection-objekt (201)PATCH/api/equipment/:id/inspections/:inspId
Upload kontrolrapport-PDF til eksisterende inspektion.
FormData: { file: PDF, maks 20 MB }{ inspection: { ..., reportUrl } }Komponenter
Sporing af vedligeholdelseskomponenter (filtre, tørrere, sikkerhedsventiler, olie).
GET/api/equipment/:id/components
List sporbare komponenter med fornyelsestidspunkter.
[{ type, label, installedAt, intervalMonths, nextDueAt, notes }]POST/api/equipment/:id/components
Tilføj komponent med fornyelsesinterval.
{ type: "sikkerhedsventil"|"filter"|"drier"|"olie"|"andet", label, installedAt, intervalMonths, notes? }Component-objekt (201)PATCH/api/equipment/:id/components
Opdatér eller forny komponent (nulstil installationsdato).
{ componentId, installedAt?, intervalMonths?, notes? }DELETE/api/equipment/:id/components
Slet sporet komponent.
{ componentId }Journalposter
Servicelog: eftersyn, lækagekontrol, reparation, påfyldning m.m.
POST/api/journal
Opret journalpost. Ved eftersyn genereres digitalt inspektionscertifikat automatisk.
{ equipmentId, type, notes, refrigerantAdded?, oilType?, signature?, ... }{ entry, certificateUrl? }GET/api/journal/:equipmentId
Hent paginerede journalposter for udstyr med typefiltrering.
?page=1&limit=25&type=eftersyn{ entries: [...], pagination }POST/api/journal/upload
Upload filer (fotos, PDF) til journalposter. Maks 10 filer, 20 MB pr. fil.
FormData: { files: File[] }{ files: [{ url, name, type, size }] }POST/api/journal/certificate
Generér digitalt inspektionscertifikat (SVG) for en eftersyn-post.
{ journalEntryId }{ certificateUrl, nextInspectionDate }GET/api/journal/certificate/pdf
Eksportér inspektionscertifikat som PDF med firmabranding.
?entryId=...PDF-fil (inline)Dokumenter
Filhåndtering: datablade, tegninger, manualer m.m. organiseret i kategorier.
GET/api/documents
List dokumenter for udstyr grupperet efter kategori.
?equipmentId=...{ categories: [{ category, documents: [...] }], totalCount }POST/api/documents/upload
Upload enkelt dokument til udstyr. Maks 50 MB.
FormData: { file, equipmentId, categoryId, description? }{ document }POST/api/documents/bulk-upload
Batch-upload med mappestruktur. Auto-opretter kategorier fra mappenavne.
FormData: { equipmentId, files: File[], paths: JSON }{ uploaded, errors, files }GET/api/documents/categories
List alle dokumentkategorier.
{ categories: [{ id, name, slug, icon }] }DELETE/api/documents/:id
Slet dokument og fjern fil fra disk.
{ success: true }GET/api/documents/:id/download
Download dokumentfil. Gæster har ikke adgang.
Filindhold med korrekt Content-TypeServiceplan
Samlet compliance-overblik og deadline-beregning for alt udstyr.
GET/api/service-plan
Batch compliance + serviceoversigt. Kan eksporteres som CSV til Excel.
?format=json|csv&status=forfalden|snart|alle&days=90{ equipment: [...], summary: { total, forfalden, snart, ok, totalCO2eqTonnes } }Notifikationer
Email-påmindelser om kommende deadlines: indstilinger pr. bruger pr. servicetype.
GET/api/notification-preferences
Hent notifikations-email og aktive præferencer pr. type.
{ notificationEmail, preferences: { eftersyn, laekagekontrol, kontrol, ... } }PUT/api/notification-preferences
Opdatér notifikations-email og slå typer til/fra.
{ notificationEmail?, preferences: { [type]: boolean } }{ success: true }Brugere & Firma
Bruger- og firmahåndtering, ejere og QR-scanning.
GET/api/company/users
List alle brugere i firmaet.
{ users: [{ id, name, email, role, active, _count: { entries } }] }POST/api/company/users
Tilføj tekniker eller ejer til firmaet.
{ name, email, phone?, role: "technician"|"owner" }{ user, owner? }GET/api/owners
List alle udstyrseejere for firmaet.
{ owners: [{ id, name, cvr, email, _count: { equipment } }] }POST/api/owners
Opret ny ejer/kunde. Kan automatisk oprette brugerkonto.
{ name, cvr?, email?, phone?, address? }{ owner, user? }POST/api/scan/:qrCode
Offentligt opslag af udstyr via QR-kode. Bruges på scan-landingssiden.
{ equipment: { id, serial, manufacturer, model, entries, ... } }GDPR & Revision
Dataudtræk, sletning og audit-log iht. GDPR.
GET/api/me
GDPR Art. 20: eksportér alle personlige data (bruger, udstyr, poster, dokumenter, audit).
{ exportedAt, user, company, equipment, journalEntries, datasheets, auditLogs }DELETE/api/me
GDPR Art. 17: slet brugerkonto. Anonymiserer audit-logs for compliance.
{ success: true }GET/api/audit
Rollebaseret audit-log. Superadmin ser alt; admin/tekniker ser firmaets logs.
?page=1&limit=25&search=...&action=...&from=2025-01-01&to=2025-12-31{ logs: [...], actions: [...], pagination }Klistermærker
Bestilling af QR-klistermærker (hvid = abonnement, blå = lifetime).
GET/api/stickers
List klistermærke-ordrer for firmaet.
{ orders: [{ type, quantity, status, company }] }POST/api/stickers
Bestil klistermærker. Beregner pris (25 kr/stk ekskl. moms). Sender ordrebekræftelse.
{ type: "hvid"|"blå", quantity: 1-500 }{ order, confirmation: { pricePerUnit, totalExclVat, vat, totalInclVat } }POST/api/qr-ark
A4-ark med ubrugte QR-koder til print. Koderne er ikke knyttet til et anlæg før nogen tildeler dem.
{ antal?: 1-60 (default 24) }{ maerkater: [{ kode, url, qrDataUrl }] }Utility
Health-check og filservering.
GET/api/health
Health check: returnerer { status: 'ok' }.
{ status: "ok" }GET/api/uploads/certificates/:filename
Servér inspektionscertifikat (SVG). Cache: immutable, 1 år.
SVG-fil (image/svg+xml)GET/api/uploads/reports/:filename
Servér kontrolrapport (PDF). Cache: immutable, 1 år.
PDF-fil (application/pdf)