Energy label preview
Submit a building envelope, ventilation, lighting, hot-water, and heating-system model. Receive a BE26 energy label and compliance summary before a final certificate exists.
Send a building model and get BE18/BE26 primary energy, energy label, compliance, monthly demand, and overheating results. Resolve Danish addresses when you need building facts or existing energy-label summaries for a workflow.
The API is for products that need calculation-grade energy numbers, not just a static registry lookup.
Submit a building envelope, ventilation, lighting, hot-water, and heating-system model. Receive a BE26 energy label and compliance summary before a final certificate exists.
Run equivalent inputs with standard: "BE18" and
standard: "BE26" to compare old and new regulatory
assumptions in your workflow.
Resolve a typed Danish address into stable building identifiers, then use those identifiers to prefill area, construction year, usage, floors, wall material, roof material, and heat supply.
Fetch slim energy-label summaries for a building to compare a new design calculation with existing classification, heated area, emissions, savings, and improvement proposals.
Download the EPC-derived JSON fixture, then send it to the calculation endpoint. The same building model is also available as raw BEXML.
export BE26_BASE_URL="https://api.example.com"
export BE26_EXAMPLE_URL="https://be26-docs.pages.dev/examples/be26-epc-example.json"
read -rsp "BE26 API key: " BE26_API_KEY
echo
curl -sS "$BE26_EXAMPLE_URL" -o be26-epc-example.json
curl -sS "$BE26_BASE_URL/v1/be26/calculate" \
-H "Authorization: Bearer $BE26_API_KEY" \
-H "Content-Type: application/json" \
--data @be26-epc-example.json
Actual EMOWeb EPC 311806905 for
Henriksvej 7, 2400 København NV. The source label is
C, valid from 2025-01-20 to
2035-01-20, with 195 m2 heated area and
district heating. The example recalculates that model as BE26 and
adds the KiWi/BE26 fields the old EPC XML does not carry:
battery, has_battery, a
Battery entity, and HeatedRoom
day/evening/night/basic ventilation values. The PV array comes
from the EPC improvement proposal.
A successful calculation returns object: "be26.calculation",
request_id, normalized input metadata, and a
summary containing annual primary energy, label,
compliance, heating, cooling, hot-water, electricity, and reference
area fields. For this fixture, the BE26 summary is
B, 75.42 kWh/m2/year, not compliant, with
195 m2 reference area.
These examples show the type of output to expect. Exact values depend on your input model and the building selected.
POST /v1/be26/calculateB, 75.42 kWh/m2/year, not compliant.GET /v1/buildings/resolveHenriksvej 7, 2400 København NV0101, street code 2820, postal code, and coordinates.GET /v1/buildings/{id}/context120, 132 m2 dwelling area, one dwelling, district heating.GET /v1/buildings/{id}/energy-labels6023018.311806905: class C, 195 m2 heated area, 105.89 kWh/m2/year.
The current API surface is intentionally small. Use
/v1/openapi.json on your base URL as the source of truth
for schemas.
Basic service health.
OpenAPI contract for the current public API surface.
Compact route summary for agents and developer tools.
Calculate BE18 or BE26 from JSON input or raw BEXML.
Resolve a Danish address query into candidate building identifiers.
Fetch curated public building context for a resolved identifier.
Fetch slim energy-label summaries for a resolved building.
curl -sS "$BE26_BASE_URL/v1/buildings/resolve?query=Henriksvej%207%2C%202400%20K%C3%B8benhavn%20NV&limit=5" \
-H "Authorization: Bearer $BE26_API_KEY"
Errors use application/problem+json. Preserve
request_id when reporting failed or surprising responses.
{
"type": "https://docs.be26.dk/errors/validation-failed",
"title": "Validation failed",
"status": 400,
"detail": "Request body failed validation.",
"code": "validation_failed",
"request_id": "req_...",
"retryable": false,
"errors": [
{
"field": "input.Building.Ae",
"message": "must be greater than zero"
}
]
}
Responses can include X-RateLimit-Limit,
X-RateLimit-Remaining, X-RateLimit-Reset,
and Retry-After. Retry only when an error response says
retryable: true.