Give us building data or an energy label. Get the BE26 result, then evaluate improvements

Send building data, or start from an existing EPC. We calculate annual primary energy consumption under BE26, return the energy label, and say whether the building complies. That result can then be used to evaluate envelope and heating measures against an energy renovation objective.

The simple flow

Start from the best data you have. The API calculates the current BE26 baseline; renovation guidance can then evaluate what changes improve that result.

1. Start with building data

Send your own model, or build one from area, envelope, windows, ventilation, hot water, heating system, PV, and battery data.

2. Or start with an EPC

Use an existing energy performance certificate as the source model when you have one. The example below starts from a real EPC and recalculates it as BE26.

3. Calculate the BE26 baseline

Call POST /v1/be26/calculate. The response gives you annual primary energy in kWh/m2/year, the BE26 energy label, and a compliance result.

4. Evaluate improvement options

Compare envelope and heating-system measures, estimate savings and cost, and choose the actions that fit the renovation target.

From result to renovation options

The calculation tells you where the building is now. Renovation guidance uses that same model to tell you what to change next.

Choose the metric

Compare measures by annual primary energy, expected energy saving, estimated investment, payback, or practical fit for the building.

Test envelope measures

Evaluate actions such as loft insulation, facade insulation, floor insulation, window replacement, door replacement, and envelope bundles where available.

Test heating measures

Evaluate heat-source changes such as oil or gas boiler replacement, heat pumps, district heating, controls, and distribution upgrades.

Choose what to do

Compare energy savings, estimated investment, payback, category, exclusions, and envelope bundles where available before selecting a renovation path.

What the result means

Most products start with the summary fields. Renovation workflows use the full model and monthly/system totals to compare scenarios.

Annual primary energy

The headline consumption number, normalized as kWh/m2/year. This is the value most user interfaces should show first.

Energy label

The calculated label for the submitted model. In the example, an existing EPC with source label C is recalculated as BE26 and returns label B.

Compliance

A boolean answer for whether the submitted model complies under the selected standard. The example result is compliant: false.

Request ID

Every calculation response includes a support ID. Store it when a result needs investigation or a customer asks why a number changed.

Quickstart

Start with the fixture if you do not have your own building data yet. It is a real EPC-derived model with a small BE26 scenario added.

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

Example input

The fixture starts from 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. For the example calculation, we add a PV scenario, a 5 kWh battery, and room ventilation assumptions, then calculate the model as BE26.

Example output

For this fixture, BE26 returns 75.42 kWh/m2/year, energy label B, and compliant: false. The full response also includes monthly demand and system totals.

Concrete examples

Most integrations use one calculation call and, when they do not already have building data, one or more lookup calls.

1. Recalculate EPC 311806905 as BE26

Call
POST /v1/be26/calculate
Input
195 m2 building model with 12 opaque elements, 19 windows/doors, district heating, a PV scenario, a 5 kWh battery, and room ventilation assumptions.
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

Use /v1/openapi.json on your base URL as the source of truth for request and response 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.