Multiple people contribute data.
One audit-ready ledger.
VantageHSG is built for teams, not for one sustainability analyst reconciling spreadsheets. This page covers the flow from operational records to defensible carbon numbers, and how to verify them.
Four steps from source record to ledger
Ingest from anywhere
Operations uploads mill test certificates. AP forwards fuel slips. Finance drops ERP spend exports. LIMS results and meter telemetry arrive through the API. Everything lands in one shared ledger.
Normalize and deduplicate
Units are converted to the base unit each emission factor is published in. Moisture is removed so tonnes are measured on a dry basis. Repeated purchase orders are removed before calculation.
Calculate from primary data
ECCC and IESO factors are stored with a version. Mass balance runs where process data is available. Spend-based estimates are labelled as estimates in every output.
Export audit-ready outputs
Scope 1, 2 and 3 reports carry a SHA-256 fingerprint, the audit trail behind each number, and exports for verifiers.
Drive the calculation yourself
Move the sliders to see how carbon in, carbon out and the emission factor set the tonnes of CO2e for a process run.
Drive the pipeline
Move the sliders — every formula below recalculates instantly.
Ingestion & Verification
Bill OCR · Lab Assay Ingest → JSON schema
Factor Resolution
ECCC 2024 NIR · Provincial grid lookup
Calculation Engine
Stoichiometric mass balance · Scope 1 / 2 / 3
Audit Sealing
SHA-256 hash chain · provenance token
🧮 Live math — see how inputs become traceable tonnes
hash: 5756e60210acec0dcc6c10d95941f2035b36331f4396c977f5ffd0606fa51e6c
Why you can trust the numbers
A carbon figure is only as useful as the record behind it. Each control below is enforced in the application or the database, and can be checked by a verifier.
Every report is fingerprinted
Each calculated report carries a SHA-256 hash of its contents. The hash is stored with the report and printed on the PDF, so a changed copy no longer matches.
Audit events are chained
Each audit event stores the hash of the event before it, starting from 64 zeros. The hash is computed on the server. The database rejects updates to audit rows, so an edit breaks the chain instead of passing unnoticed.
The chain can be checked
An anchored check compares the event count and head hash in constant time. A full check recomputes every hash, up to 5,000 events, and is run on demand by an administrator.
Calculations can be replayed
An administrator can recalculate any process run from its stored streams and compare the result with the original. A difference under 0.01% is marked verified. Anything larger is flagged as drifted.
How the math works, visually
Two short animations: the EAF carbon mass balance and the SHA-256 audit chain.
What you get in the product
Dashboard views of the same pipeline, not abstract diagrams.



See the pipeline in motion
A London Hydro utility bill, extracted, calculated and sealed to the ledger.
Send data from your systems
The same ingestion path serves the product and the API. Each endpoint below accepts JSON and returns the stored result.
| Endpoint | What it accepts | Auth |
|---|---|---|
POST /api/v1/ingest/erp | A non-empty transactions array in CAD. Produces an estimated Scope 3 result from spend. | API key or session |
POST /api/v1/ingest/telemetry | 1 to 500 readings per request. Consumption metrics with an intervalSeconds produce Scope 1 and Scope 2 emissions. | API key or session |
POST /api/v1/ingest/lims | Measured input and output samples with quantified carbon and moisture. | API key or session |
GET /api/v1/emissions | Emission rows filtered by scope and period, as JSON or CSV. Up to 1,000 rows per request. | API key |
GET /api/v1/reports | A page of reports (limit up to 100, offset), or one report with ?id=. | API key |
GET and POST /api/v1/keys | List keys, or create one. The plaintext key is returned once, at creation. | API key or session |
Idempotent ingestion
Each ingest request carries an eventId. Resending the same payload returns the original result without writing again. Reusing an eventIdwith a different payload returns 409 EVENT_CONFLICT. If you omit it, the server generates one, so send a stable value for safe retries.
Authentication and keys
Send the key as Authorization: Bearer <key>. Keys start with vh_live_, and only their SHA-256 hash is stored. Keys can carry an expiry. A missing, unknown or expired key returns 401.
Limits and errors
Request bodies are capped at 1 MiB and return 413 above that. Emissions and report reads allow 60 requests per minute per key. Over the limit, the response is 429 with X-RateLimit-* headers and Retry-After. Validation errors return 400 with a message naming the field.
curl -X POST "$BASE_URL/api/v1/ingest/telemetry" \
-H "Authorization: Bearer $VANTAGEHSG_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"facilityId": "hamilton-plant",
"eventId": "2026-03-31T23:00Z-eaf-1",
"observedAt": "2026-03-31T23:00:00Z",
"intervalSeconds": 3600,
"readings": [{
"machineId": "eaf-1",
"machineName": "EAF 1",
"metric": "electricity_consumed",
"unit": "kWh",
"value": 1250
}]
}'Ready to prove it on your data?
Watch the demo, request a sample report from one document, or start a paid pilot.