Til revisor og controller

Sådan efterprøves evidensen

Celembi kalder sin afregningsdokumentation revisorklar. Det er en påstand, en revisor skal kunne teste uden at stole på os. Denne side siger præcis, hvad evidensen består af, hvad der fastfryses i afregningsøjeblikket, hvordan hashen genberegnes med tre linjer kode, og hvor grænsen går: Celembi er datalaget, ikke revisionen.

Den korte version
  1. To måleraflæsninger, én deterministisk afregning. Hver leverance får en evidensrapport, hvis SHA-256-hash gemmes i afregningsøjeblikket sammen med de satser, den blev beregnet med.
  2. Rapporten indeholder det nøjagtige objekt, hashen er beregnet over, og opskriften. Enhver kan genberegne den offline og sammenligne.
  3. Et kald til API'et svarer, om en given hash er den, der blev gemt ved afregningen, uden at afsløre et eneste tal.

Hvad evidensen består af

For hver afregnet leverance findes én rapport (GET /api/v2/deals/{id}/esg-report) med fire blokke:

BlokIndholdKilde
MålingKontraheret og målt volumen fra begge parter, afvigelse, måler-ID, tidspunkt, hvem der indsendte (bruger eller nøgle-fingeraftryk) og under hvilket request-id, afregningsgrundlagParternes egne aflæsninger, som indsendt
ØkonomiAftalt pris, bruttoværdi, net- og systemtarif, tabstillæg, temperaturløft, moms, købers samlede pris, sælgers nettoprovenu, Celembis gebyr, eventuel bodAfregningsmotoren, Decimal med to decimaler
EmissionerKøbers erklærede alternativ, emissionsfaktor, undgået CO2 i ton, undgået CO2-afgift, afgiftssatsPartnerens profil og satserne, som de var ved afregningen
RevisionBeregningsversion, hash, det objekt hashen er beregnet over, opskriften, integritetsstatus, tidspunkt for fastfrysningDenne side og koden bag den

Hvad der fastfryses ved afregningen

Tallene i afregningen (volumen, pris, beløb) er uforanderlige, når leverancen er afregnet. Men en rapport læser også ting, der ellers ville kunne ændre sig bagefter: CO2-afgiftssatsen, tarifferne, købers erklærede varmealternativ og dets emissionsfaktor, og en eventuel dokumenteret substitutionspris. Alle disse gemmes på leverancen i afregningsøjeblikket som rapportens grundlag, sammen med hashen.

Konsekvensen er den, en revisor har brug for: en rapport hentet om tre år bygger på de samme satser som den dag, der blev afregnet, og giver samme hash. Ændrer nogen et tal i databasen, siger rapporten mismatch. En leverance afregnet, før fastfrysningen blev indført den 6. september 2026, siger not_frozen og beregnes med de aktuelle satser; den er ikke evidens på samme niveau, og rapporten skjuler det ikke.

Genberegn hashen selv

Rapportens revisionsblok indeholder evidence_payload: præcis det objekt, hashen er beregnet over. Opskriften er JSON med sorterede nøgler, uden mellemrum, UTF-8 uden ASCII-escaping, derefter SHA-256. I Python:

import hashlib, json

payload = report["audit"]["evidence_payload"]
digest = hashlib.sha256(
    json.dumps(payload, sort_keys=True, separators=(",", ":"), ensure_ascii=False).encode("utf-8")
).hexdigest()
assert digest == report["audit"]["evidence_hash_sha256"]

Skal en revisor tjekke en udleveret rapport uden at have adgang til tallene igen, svarer GET /api/v2/deals/{id}/evidence/verify?hash=… med fire ting: hashen gemt ved afregningen, hashen genberegnet nu, om den medsendte hash er den gemte, og hvilken offentliggjort sammenfatning den indgår i. Svaret indeholder ingen beløb eller mængder.

Substitutionsprisen: loftet er forsyningens, og prøven står i hver rapport

Efter varmeforsyningsloven må en forsyning kun indregne nødvendige omkostninger, og Forsyningstilsynets praksis sætter loftet for købt varme ved substitutionsprisen: forsyningens egen alternative produktionsomkostning, med forsyningens meromkostninger ved at modtage varmen (stikledning og veksler som annuitet, booster-varmepumpe, pumpning) trukket fra, før sælgers pris bedømmes. Celembi bygger det ind tre steder:

  1. Loftet håndhæves. Forsyningen dokumenterer substitutionspris og meromkostning pr. MWh på sin enhed. Derefter afviser platformen ethvert behov med et maksimum over substitutionsprisen minus meromkostningen, og motoren kan aldrig foreslå en pris over behovets maksimum. En handel over loftet kan ikke opstå.
  2. Prøven står i hver rapport. Substitutionsprøven i evidensrapporten sammenligner købers samlede pris pr. MWh (varme, tariffer, tabstillæg, temperaturløft) plus meromkostningen med substitutionsprisen, og viser luften i kroner og procent og om prøven er bestået. Er substitutionsprisen forsyningens egen, står der partner_documented; ellers bruges Celembis estimat, og det står der.
  3. Prøven fryses. Substitutionspris og meromkostning indgår i det grundlag, der fastfryses ved afregningen, så prøven giver samme resultat, når tilsynet spørger.
Til anmeldelsen efter § 21. Forsyningen anmelder platformens vilkår som sin standardaftale for køb af overskudsvarme og denne side som metoden for prisprøven. Herefter dokumenteres hver handel efter samme metode, og månedsrapporten pr. enhed er det bilag, der vedlægges, hvis tilsynet beder om det. Celembi ændrer ikke metoden uden ny beregningsversion.

Måneden hænger sammen med leverancerne

Månedsrapporten pr. enhed (GET /api/v2/entities/{id}/monthly-evidence-report) summerer de afregnede leverancer i måneden, og den summerer med hver leverances fastfrosne faktor og sats, ikke med dagens. Den bærer listen over de enkelte leverancers hashes i sin egen hash, så kæden fra måned til afregning er en del af evidensen. Den udskriftsklare udgave viser, hvor mange af månedens leverancer der bærer et fastfrosset bevis.

Hvad evidensen er, og ikke er

Til CSRD/ESRS E1 og EED artikel 26. Emissionsblokken oplyser undgået CO2 som volumen gange emissionsfaktoren for det alternativ, køberen selv har erklæret, og undgået afgift med den sats, der gjaldt ved afregningen. Begge er beregninger på et erklæret alternativ, ikke målte emissioner, og rapporten skriver grundlaget ud. Skal jeres egen faktor bruges, sættes den på enheden, før leverancen afregnes; efter afregning er den fastfrosset.

Vil revisor se det på et rigtigt eksempel, sender vi en afregnet leverance fra demomiljøet med rapport, payload og verifikationskald.

Bed om et eksempel API-reference

Siden følger koden: beregningsversionen står i hver rapport, og en ændring af opskriften får en ny version, aldrig en stille genberegning. Senest gennemgået 6. september 2026. Spørgsmål: kontakt@celembi.dk.