API Referencev1.0

RefiLog API

Komplet REST API til digital udstyrsjournal for køle-, varmepumpe- og trykanlæg. Session-baseret autentificering via OTP.

Base URLhttps://refilog.dk
Authsession_tokencookie
Formatapplication/json

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.

# 1. Anmod om OTP-kode
POST /api/auth/otp
{ "email": "tekniker@firma.dk" }
# 2. Verificér kode → modtag session cookie
POST /api/auth/verify
{ "email": "tekniker@firma.dk", "code": "12345678" }
# 3. Brug session cookie til alle efterfølgende kald
GET /api/equipment
Cookie: session_token=...
Rollebaseret adgang

Superadmin → Admin → Tekniker → Ejer → Inspektør → Gæst. Hvert endpoint kræver en minimumsrolle.

Rate limiting

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.

CSRF-beskyttelse

Alle muterende requests (POST/PATCH/PUT/DELETE) kræver gyldig Origin eller Referer header fra godkendte domæner.

Data-isolation

Hvert firma kan kun se eget udstyr og egne data. Ejere ser kun deres eget udstyr. Gæster er scopet til ét anlæg.

Security headers

CSP, HSTS, X-Frame-Options: DENY, nosniff, Permissions-Policy. TLS enforced via Let's Encrypt.

Audit logging

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.

Auth
Ingen (offentlig)
Request
{ email: string }
Response
{ success: true }
Note: Rate-limiteret: 5/IP/time, 3/email/10min. I TEST_MODE returneres _dev_code.
POST/api/auth/verify

Verificér OTP-kode og opret session. Sætter session_token cookie.

Auth
Ingen (offentlig)
Request
{ email: string, code: string }
Response
{ success: true, userId: string }
Note: Tjekker firmastatus (pending/rejected) før login tillades.
GET/api/auth/session

Returnér aktuel bruger eller gæsteadgang-info.

Auth
Session cookie / Guest token
Response
{ authenticated: true, user: { id, name, email, role, company } }
DELETE/api/auth/session

Log ud — sletter session_token cookie.

Auth
Session cookie
Response
{ success: true }
POST/api/auth/guest

Opret midlertidig gæstesession (4 timer) til at se udstyrshistorik.

Auth
Ingen (offentlig)
Request
{ email: string, equipmentId: string }
Response
{ success: true }
Note: Rate-limiteret. Ejer notificeres om gæsteadgang.

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.

Auth
Ingen (offentlig)
Request
{ cvr: string, companyName, branchCode, branchText, contactName, contactEmail, contactPhone? }
Response
{ success: true, companyId, status, autoApproved: boolean }
GET/api/cvr

Slå firma op i det danske CVR-register.

Auth
Ingen (offentlig)
Request
?cvr=12345678
Response
{ 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.

Auth
Session
Request
?page=1&limit=25&search=...
Response
{ equipment: [...], pagination: { page, limit, total, pages } }
POST/api/equipment

Opret udstyr med auto-genereret QR-kode. Kan inkludere billeder af eksisterende papir-logbog.

Auth
Admin / Tekniker
Request
{ serial, equipmentType, manufacturer, model, refrigerant?, chargeKg?, location, address?, ... }
Response
{ equipment, qrCode, photoUrls }
GET/api/equipment/:id

Hent enkelt udstyr med de seneste 50 journalposter.

Auth
Session / Gæst
Response
{ equipment: { ..., entries: [...] } }
PATCH/api/equipment/:id

Opdatér udstyr, godkend/afvis, eller tilknyt datablad.

Auth
Admin
Request
{ manufacturer?, model?, refrigerant?, ... } eller { action: "approve" }
Response
{ equipment }
POST/api/equipment/qr-print

Generér QR-kode data-URLs til batch-print af labels.

Auth
Admin / Tekniker
Request
{ equipmentIds: string[] (maks 100) }
Response
{ equipment: [{ id, serial, qrCode, qrDataUrl, ... }] }
GET/api/equipment/:id/compliance

Beregn regulatorisk compliance-status (EU 2024/573 F-gas, BEK 498, PED).

Auth
Session
Response
{ compliance: { leakCheck, inspection, co2eqFormatted, warnings, overallStatus } }
GET/api/equipment/:id/pdf

Generér PDF-rapport med udstyrsdata, compliance og journalhistorik.

Auth
Session
Response
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.

Auth
Session
Response
[{ serial, vesselType, volumeLiters, designPressureBar, pedCategory, inspections }]
POST/api/equipment/:id/vessels

Registrér trykbeholder med fulde tekniske specifikationer.

Auth
Admin / Tekniker
Request
{ serial, vesselType, volumeLiters?, designPressureBar?, pedCategory?, ... }
Response
Vessel-objekt (201)
GET/api/equipment/:id/inspections

List kontroller (opstilling, periodisk, beholder, trykprøvning). Kan filtreres på type/beholder.

Auth
Session
Request
?type=periodisk_enhedskontrol&vesselId=...
Response
[{ type, inspectionDate, result, nextDueDate, inspectorName, inspectorOrg, certificateNo }]
POST/api/equipment/:id/inspections

Opret kontrolrapport. Kræver inspektørdetaljer og næste kontroldato.

Auth
Admin / Tekniker / Inspektør
Request
{ vesselId?, type, inspectionDate, result, nextDueDate, inspectorName, inspectorOrg, certificateNo }
Response
Inspection-objekt (201)
PATCH/api/equipment/:id/inspections/:inspId

Upload kontrolrapport-PDF til eksisterende inspektion.

Auth
Admin / Inspektør
Request
FormData: { file: PDF, maks 20 MB }
Response
{ inspection: { ..., reportUrl } }

Komponenter

Sporing af vedligeholdelseskomponenter (filtre, tørrere, sikkerhedsventiler, olie).

GET/api/equipment/:id/components

List sporbare komponenter med fornyelsestidspunkter.

Auth
Session
Response
[{ type, label, installedAt, intervalMonths, nextDueAt, notes }]
POST/api/equipment/:id/components

Tilføj komponent med fornyelsesinterval.

Auth
Admin / Tekniker
Request
{ type: "sikkerhedsventil"|"filter"|"drier"|"olie"|"andet", label, installedAt, intervalMonths, notes? }
Response
Component-objekt (201)
PATCH/api/equipment/:id/components

Opdatér eller forny komponent (nulstil installationsdato).

Auth
Admin / Tekniker
Request
{ componentId, installedAt?, intervalMonths?, notes? }
DELETE/api/equipment/:id/components

Slet sporet komponent.

Auth
Admin
Request
{ componentId }

Journalposter

Servicelog — eftersyn, lækagekontrol, reparation, påfyldning m.m.

POST/api/journal

Opret journalpost. Ved eftersyn genereres digitalt inspektionscertifikat automatisk.

Auth
Admin / Tekniker
Request
{ equipmentId, type, notes, refrigerantAdded?, oilType?, signature?, ... }
Response
{ entry, certificateUrl? }
Note: For eftersyn: beregner næste inspektionsdato ud fra CO₂-ækvivalent. Genererer SVG-certifikat.
GET/api/journal/:equipmentId

Hent paginerede journalposter for udstyr med typefiltrering.

Auth
Session
Request
?page=1&limit=25&type=eftersyn
Response
{ entries: [...], pagination }
POST/api/journal/upload

Upload filer (fotos, PDF) til journalposter. Maks 10 filer, 20 MB pr. fil.

Auth
Admin / Tekniker / Inspektør
Request
FormData: { files: File[] }
Response
{ files: [{ url, name, type, size }] }
POST/api/journal/certificate

Generér digitalt inspektionscertifikat (SVG) for en eftersyn-post.

Auth
Session
Request
{ journalEntryId }
Response
{ certificateUrl, nextInspectionDate }
GET/api/journal/certificate/pdf

Eksportér inspektionscertifikat som PDF med firmabranding.

Auth
Session
Request
?entryId=...
Response
PDF-fil (inline)

Dokumenter

Filhåndtering — datablade, tegninger, manualer m.m. organiseret i kategorier.

GET/api/documents

List dokumenter for udstyr grupperet efter kategori.

Auth
Session
Request
?equipmentId=...
Response
{ categories: [{ category, documents: [...] }], totalCount }
POST/api/documents/upload

Upload enkelt dokument til udstyr. Maks 50 MB.

Auth
Admin / Tekniker / Inspektør
Request
FormData: { file, equipmentId, categoryId, description? }
Response
{ document }
POST/api/documents/bulk-upload

Batch-upload med mappestruktur. Auto-opretter kategorier fra mappenavne.

Auth
Admin / Tekniker / Inspektør
Request
FormData: { equipmentId, files: File[], paths: JSON }
Response
{ uploaded, errors, files }
GET/api/documents/categories

List alle dokumentkategorier.

Auth
Session
Response
{ categories: [{ id, name, slug, icon }] }
DELETE/api/documents/:id

Slet dokument og fjern fil fra disk.

Auth
Uploader / Admin
Response
{ success: true }
GET/api/documents/:id/download

Download dokumentfil. Gæster har ikke adgang.

Auth
Session (ikke gæst)
Response
Filindhold med korrekt Content-Type

Serviceplan

Samlet compliance-overblik og deadline-beregning for alt udstyr.

GET/api/service-plan

Batch compliance + serviceoversigt. Kan eksporteres som CSV til Excel.

Auth
Session
Request
?format=json|csv&status=forfalden|snart|alle&days=90
Response
{ equipment: [...], summary: { total, forfalden, snart, ok, totalCO2eqTonnes } }
Note: CSV med BOM til Excel UTF-8. Includes: serienr, QR, fabrikant, model, kølemiddel, ladning, CO₂-eq, lokation, ejer, firma, status, deadlines.

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.

Auth
Session
Response
{ notificationEmail, preferences: { eftersyn, laekagekontrol, kontrol, ... } }
PUT/api/notification-preferences

Opdatér notifikations-email og slå typer til/fra.

Auth
Session
Request
{ notificationEmail?, preferences: { [type]: boolean } }
Response
{ success: true }

Brugere & Firma

Bruger- og firmahåndtering, ejere og QR-scanning.

GET/api/company/users

List alle brugere i firmaet.

Auth
Admin
Response
{ users: [{ id, name, email, role, active, _count: { entries } }] }
POST/api/company/users

Tilføj tekniker eller ejer til firmaet.

Auth
Admin
Request
{ name, email, phone?, role: "technician"|"owner" }
Response
{ user, owner? }
GET/api/owners

List alle udstyrseejere for firmaet.

Auth
Session
Response
{ owners: [{ id, name, cvr, email, _count: { equipment } }] }
POST/api/owners

Opret ny ejer/kunde. Kan automatisk oprette brugerkonto.

Auth
Admin
Request
{ name, cvr?, email?, phone?, address? }
Response
{ owner, user? }
POST/api/scan/:qrCode

Offentligt opslag af udstyr via QR-kode. Bruges på scan-landingssiden.

Auth
Ingen (offentlig)
Response
{ 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).

Auth
Session
Response
{ exportedAt, user, company, equipment, journalEntries, datasheets, auditLogs }
DELETE/api/me

GDPR Art. 17 — slet brugerkonto. Anonymiserer audit-logs for compliance.

Auth
Session
Response
{ success: true }
GET/api/audit

Rollebaseret audit-log. Superadmin ser alt; admin/tekniker ser firmaets logs.

Auth
Session
Request
?page=1&limit=25&search=...&action=...&from=2025-01-01&to=2025-12-31
Response
{ logs: [...], actions: [...], pagination }

Klistermærker

Bestilling af QR-klistermærker (hvid = abonnement, blå = lifetime).

GET/api/stickers

List klistermærke-ordrer for firmaet.

Auth
Admin
Response
{ orders: [{ type, quantity, status, company }] }
POST/api/stickers

Bestil klistermærker. Beregner pris (25 kr/stk ekskl. moms). Sender ordrebekræftelse.

Auth
Admin
Request
{ type: "hvid"|"blå", quantity: 1-500 }
Response
{ order, confirmation: { pricePerUnit, totalExclVat, vat, totalInclVat } }
Note: Ordrebekræftelse med 14 dages fortrydelsesret (e-handelslov).

Utility

Health-check og filservering.

GET/api/health

Health check — returnerer { status: 'ok' }.

Auth
Ingen
Response
{ status: "ok" }
GET/api/uploads/certificates/:filename

Servér inspektionscertifikat (SVG). Cache: immutable, 1 år.

Auth
Ingen
Response
SVG-fil (image/svg+xml)
GET/api/uploads/reports/:filename

Servér kontrolrapport (PDF). Cache: immutable, 1 år.

Auth
Ingen
Response
PDF-fil (application/pdf)