Calculate Danish building energy performance.

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.

What you can build

The API is for products that need calculation-grade energy numbers, not just a static registry lookup.

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.

BE18 to BE26 comparison

Run equivalent inputs with standard: "BE18" and standard: "BE26" to compare old and new regulatory assumptions in your workflow.

Address prefill

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.

Existing label lookup

Fetch slim energy-label summaries for a building to compare a new design calculation with existing classification, heated area, emissions, savings, and improvement proposals.

Quickstart

Download the EPC-derived JSON fixture, then send it to the calculation endpoint. The same building model is also available as raw BEXML.

Environment
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
Calculate
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

Fixture used on this page

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.

Success response

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.

Concrete examples

These examples show the type of output to expect. Exact values depend on your input model and the building selected.

1. Recalculate EPC 311806905 as BE26

Call
POST /v1/be26/calculate
Input
195 m2 EPC model with 12 opaque elements, 19 windows/doors, district heating, the EPC's PV proposal, a 5 kWh battery, and KiWi heated-room ventilation fields.
Output
B, 75.42 kWh/m2/year, not compliant.

2. Resolve a Danish address

Call
GET /v1/buildings/resolve
Input
Henriksvej 7, 2400 København NV
Output
Address ID, access-address ID, municipality 0101, street code 2820, postal code, and coordinates.

3. Fetch building facts

Call
GET /v1/buildings/{id}/context
Input
The address ID returned for Henriksvej 7.
Output
1919 construction year, single-family use code 120, 132 m2 dwelling area, one dwelling, district heating.

4. Compare with existing labels

Call
GET /v1/buildings/{id}/energy-labels
Input
BFE 6023018.
Output
Existing EPC 311806905: class C, 195 m2 heated area, 105.89 kWh/m2/year.

Endpoints

The current API surface is intentionally small. Use /v1/openapi.json on your base URL as the source of truth for schemas.

GET

/v1/health

Basic service health.

GET

/v1/openapi.json

OpenAPI contract for the current public API surface.

GET

/v1/_describe

Compact route summary for agents and developer tools.

POST

/v1/be26/calculate

Calculate BE18 or BE26 from JSON input or raw BEXML.

GET

/v1/buildings/resolve

Resolve a Danish address query into candidate building identifiers.

GET

/v1/buildings/{id}/context

Fetch curated public building context for a resolved identifier.

GET

/v1/buildings/{id}/energy-labels

Fetch slim energy-label summaries for a resolved building.

Building lookup
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

Errors use application/problem+json. Preserve request_id when reporting failed or surprising responses.

Problem JSON
{
  "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"
    }
  ]
}

Rate limits and retries

Responses can include X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, and Retry-After. Retry only when an error response says retryable: true.