# baseray API reference

> The same building records you see in the app, as JSON: buildings in an area ranked by size, one building’s full record, the businesses registered at its address, and the buildings at a point.

Coverage grows country by country: Romania and Czechia today. An area outside the covered countries answers with no buildings, not an error. [See the live countries and request yours](https://baseray.tech/countries).

Base URL: https://api.baseray.ai/v1 · Version 1.0.0 · OpenAPI document: https://baseray.tech/docs/api/openapi.json

## Authentication

Every request needs a workspace API key. Create one in the app under **Settings → API keys**; the key is shown once, so store it in your secret manager.

Send the key in the `Authorization` header as a bearer token. Keys belong to the workspace: anyone in the workspace can create one, and the creator or a workspace owner can revoke it. A key stops working when it is revoked, when it expires, or when its creator leaves the workspace.

## Rate limits and quotas

Each key can make 60 requests a minute. Each workspace can make 5,000 requests a day, counted per UTC day across all its keys.

Every response tells you where you stand: `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset` for the minute, `X-Daily-Quota-Limit` and `X-Daily-Quota-Remaining` for the day. Over a limit you get `429` with a `Retry-After` header; wait that many seconds before retrying.

## Credits

Every building an answer returns costs the workspace 1 credit, once: a building the workspace opened in the last 365 days, in the app, the API or an AI assistant, is free. A page of results is charged all or nothing; when the workspace has too few credits left, the request answers `402` with `insufficient_credits` and returns nothing.

`X-Credits-Charged` and `X-Credits-Remaining` say what a request cost and what is left. A new account comes with 5 credits, so it opens 5 buildings free with no card; they last 30 days from sign-up. After that, credits come with a plan: the pricing page lists them.

## Errors

Errors use the HTTP status and one JSON shape, so you can branch on `error.code`:

| Status | Code | Meaning |
|---|---|---|
| 400 | `invalid_parameter` | A parameter is missing or invalid. `error.parameter` names it. |
| 401 | `missing_api_key` | No `Authorization: Bearer` header was sent. |
| 401 | `invalid_api_key` | The key does not exist. |
| 401 | `revoked_api_key` | The key was revoked. |
| 401 | `expired_api_key` | The key has expired. Create a new one. |
| 402 | `insufficient_credits` | The workspace has fewer credits left than the buildings in the answer it has not opened. Nothing was returned or charged. |
| 403 | `insufficient_scope` | The key may not call this endpoint. |
| 403 | `workspace_access_revoked` | The key’s creator no longer belongs to the workspace. |
| 404 | `not_found` | No building has this id. |
| 429 | `rate_limited` | Over 60 requests this minute for this key. Retry after `Retry-After` seconds. |
| 429 | `quota_exceeded` | The workspace used its daily requests. The quota resets at midnight UTC. |
| 503 | `upstream_unavailable` | The data service is temporarily unavailable. Retry with exponential backoff. |

## Pagination

List endpoints take `limit` and `offset` and return `meta.total` with `links.next`, the URL of the next page or `null` on the last one. `offset + limit` may not exceed 10,000.

Counting stops at 10,000 buildings. When `meta.total_is_capped` is `true`, the area holds more than that: narrow the box or add filters rather than paging further.

## Buildings in an area, ranked

`GET /buildings` · https://baseray.tech/docs/api/list-buildings

One ranked page of the buildings inside `bbox` that pass every filter given. Filters of different names combine with AND; the values of one list filter combine with OR. An area outside the countries baseray covers answers with no buildings; https://baseray.tech/countries lists them and takes requests for others.

Parameters:

- `bbox` (query, string, required): The area to search: `minLon,minLat,maxLon,maxLat` in WGS84 degrees. Each side may span at most 3 degrees; search a county, city or district.
- `sort` (query, volume | area | height | registered_business_turnover | registered_business_employees, default "volume"): Ranking, largest first: `volume` (m³), `area` (footprint, m²), `height` (m), `registered_business_turnover` (the largest latest turnover of a business registered at the address, in `registered_business_turnover_currency`, which it requires) or `registered_business_employees` (the largest stated size; a band ranks where it starts, so 10–19 ranks as 10).
- `limit` (query, integer, 1–100, default 25): Buildings per page, 1 to 100.
- `offset` (query, integer, 0–10000, default 0): Buildings to skip, for the next page. `offset + limit` must be at most 10,000; past that, narrow `bbox`.
- `category` (query, array of residential_house | apartment_block | commercial | industrial | public | agricultural | ancillary | unknown): Keep buildings of any of these categories. Repeat the parameter or give a comma list: `category=commercial,industrial`. `ancillary` is an annex or outbuilding.
- `building_type` (query, array of string): Keep buildings of any of these granular types, combined with `category` by OR: e.g. `office`, `warehouse`, `school`, `apartments`, `garage`. Repeatable or a comma list.
- `roof_shape` (query, array of gabled | hipped | flat | pyramidal | skillion | round | mansard | half_hipped | gambrel | dome): Keep buildings with any of these roof shapes. Repeatable or a comma list.
- `min_floors` (query, integer, 0–500): At least this many floors above ground. Buildings where this value is unknown are left out.
- `max_floors` (query, integer, 0–500): At most this many floors above ground. Buildings where this value is unknown are left out.
- `min_dwellings` (query, integer, 0–1000000): At least this many dwellings, where known. Buildings where this value is unknown are left out.
- `max_dwellings` (query, integer, 0–1000000): At most this many dwellings, where known. Buildings where this value is unknown are left out.
- `min_entrances` (query, integer, 1–1000000): At least this many entrances (each listed address of the building counts as one). Buildings where this value is unknown are left out.
- `max_entrances` (query, integer, 1–1000000): At most this many entrances. Buildings where this value is unknown are left out.
- `address_corroboration` (query, array of corroborated | single_source | conflicting): Keep buildings whose shown address is graded any of: `corroborated` (an independent record gives the same house number), `single_source` (only one record), `conflicting` (another record gives another number). Buildings shown without a house number match none.
- `min_area_m2` (query, number, 0–1000000000): Minimum ground footprint, in square metres.
- `max_area_m2` (query, number, 0–1000000000): Maximum ground footprint, in square metres.
- `min_height_m` (query, number, 0–1000): Minimum height, in metres. Buildings where this value is unknown are left out.
- `max_height_m` (query, number, 0–1000): Maximum height, in metres. Buildings where this value is unknown are left out.
- `min_volume_m3` (query, number, 0–1000000000): Minimum volume, in cubic metres. Buildings where this value is unknown are left out.
- `max_volume_m3` (query, number, 0–1000000000): Maximum volume, in cubic metres. Buildings where this value is unknown are left out.
- `measured_height_only` (query, boolean, default false): Keep only buildings whose volume comes from a measurement of the building itself: a survey, or a surface model measured over its roof. Despite its name this filter reads the volume, not the height, and a volume integrated under a measured roof still has `volume_basis` `estimated`, since its heights, not its solid, were measured.
- `solar_presence` (query, array of registered | detected | registered_at_address | none_seen | unclear | unknown): Keep buildings whose settled solar answer, their `solar_presence`, is any of these. `registered` and `detected` together are the buildings known to carry panels; `registered_at_address` is an installation registered at an address the building shares with others; `none_seen` is a roof photo showing none with no register entry; `unknown` is neither a register entry nor a usable photo. Repeatable or a comma list.
- `exclude_solar_presence` (query, array of registered | detected | registered_at_address | none_seen | unclear | unknown): Leave out buildings whose `solar_presence` is any of these, for example `registered,detected` to leave out the buildings known to carry panels. An answer may not be both kept by `solar_presence` and left out here. Repeatable or a comma list.
- `existing_solar_panels` (query, array of detected | none_seen | unclear): Keep buildings whose roof photo was checked for solar panels with any of these results. This reads the photo alone, whatever a register states: `none_seen` keeps a building with a registered installation its photo does not show. Use `solar_presence` for the settled answer. Buildings never checked, or whose photo was too coarse to check, match none. Repeatable or a comma list.
- `registered_solar` (query, boolean): `true` keeps buildings at whose address an official register (a grid operator's list of connected installations, or the energy regulator's licence register) states a solar installation: those whose `registered_solar` is not null. `false` keeps buildings no register states one for, which says nothing of their roofs: a register lists only what was connected to the grid, and only where its address is one a building holds. Leave it out to keep both.
- `registered_solar_storage` (query, boolean): Among buildings with a registered solar installation: `true` keeps those a register states store energy (a battery), `false` those stated to store none. A building whose register does not say matches neither. Not accepted with `registered_solar=false`.
- `min_registered_solar_kw` (query, number, ≤ 1000000000): At least this much installed power, in kW, registered at the building's address, counting the installations that state theirs. Where only some state it a building can match on those while its `registered_solar.installed_power_kw`, which is given only for a whole sum, is null. Buildings with no registered installation, or none stating its power, are left out. Not accepted with `registered_solar=false`.
- `has_solar_potential` (query, boolean, default false): Keep only buildings whose roof has a solar-potential estimate.
- `min_panel_count` (query, integer, 0–1000000): At least this many solar panels fit on the roof. Buildings where this value is unknown are left out.
- `max_panel_count` (query, integer, 0–1000000): At most this many solar panels fit on the roof. Buildings where this value is unknown are left out.
- `min_capacity_kwp` (query, number, 0–1000000000): Minimum rooftop solar capacity, in kWp. Buildings where this value is unknown are left out.
- `max_capacity_kwp` (query, number, 0–1000000000): Maximum rooftop solar capacity, in kWp. Buildings where this value is unknown are left out.
- `min_yearly_energy_kwh` (query, number, 0–1000000000): Minimum yearly rooftop solar energy, in kWh. Buildings where this value is unknown are left out.
- `max_yearly_energy_kwh` (query, number, 0–1000000000): Maximum yearly rooftop solar energy, in kWh. Buildings where this value is unknown are left out.
- `min_co2_savings_kg_per_year` (query, number, 0–1000000000): Minimum CO₂ a rooftop solar installation would save, in kg a year. Buildings where this value is unknown are left out.
- `max_co2_savings_kg_per_year` (query, number, 0–1000000000): Maximum CO₂ a rooftop solar installation would save, in kg a year. Buildings where this value is unknown are left out.
- `has_3d_model` (query, boolean, default false): Keep only buildings with a reconstructed 3D model of their roof.
- `has_registered_business` (query, boolean, default false): Keep only buildings with at least one active business whose registered office is the building's address. A registered office is never ownership or occupancy.
- `registered_business_name` (query, string, 2–120 characters): Keep buildings where the name of a business registered at the address contains this text.
- `min_registered_business_turnover` (query, integer): Minimum latest turnover of a business registered at the address, in whole units of `registered_business_turnover_currency` (required with it).
- `max_registered_business_turnover` (query, integer): Maximum latest turnover of a business registered at the address, in whole units of `registered_business_turnover_currency` (required with it).
- `registered_business_turnover_currency` (query, string): ISO 4217 currency of the turnover bounds and of the turnover sort, e.g. `RON`, `CZK`, `EUR`. Required with a turnover bound or `sort=registered_business_turnover`.
- `registered_business_financial_year` (query, integer, 1990–2100): Keep buildings whose registered business's latest financial statement is for this year.
- `min_registered_business_employees` (query, integer, 0–1000000): At least this many employees in one business registered at the address, reading its whole stated size: a band counts only when all of it is at or above the value (10–19 matches 10, not 15). A business whose size is not stated never matches.
- `max_registered_business_employees` (query, integer, 0–1000000): At most this many employees in every business registered at the address whose size is stated; an open-ended top band never matches.
- `has_annual_heating_estimate` (query, boolean, default false): Keep only buildings with an annual heating-demand estimate for the local climate.
- `has_thermal_assessment` (query, boolean, default false): Keep only buildings with a building-specific thermal assessment (energy certificate, audit, as-built model or survey).
- `has_peak_heat_load` (query, boolean, default false): Keep only buildings whose thermal assessment supplies the design temperatures a peak heat load needs.
- `has_recent_climate_trend` (query, boolean, default false): Keep only buildings with a recent rolling climate average and trend at their location.
- `has_recent_temperature_extremes` (query, boolean, default false): Keep only buildings with a complete recent temperature-extremes profile at their location.
- `has_recent_precipitation` (query, boolean, default false): Keep only buildings with a complete recent precipitation profile at their location.
- `min_recent_frost_days` (query, number, 0–366): At least this many frost days a year, averaged over recent complete years. Buildings where this value is unknown are left out.
- `max_recent_minimum_daily_temperature_c` (query, number, -100–100): The coldest daily minimum of recent complete years is at most this, in °C. Buildings where this value is unknown are left out.
- `min_recent_hot_days` (query, number, 0–366): At least this many hot days a year, averaged over recent complete years. Buildings where this value is unknown are left out.
- `min_recent_max_one_day_precipitation_mm` (query, number, 0–5000): The wettest single day of recent complete years brought at least this much precipitation, in mm. Buildings where this value is unknown are left out.
- `flood_zone` (query, array of 5_year | 10_year | 20_year | 50_year | 100_year | 100_year_climate_change | 500_year | 1000_year | 10000_year): Keep buildings whose `flood_zone`, the most frequently flooded zone of an official flood hazard map they lie in, is any of these: zones are named by the return period of their flood, and `100_year_climate_change` is the 1-in-100-year flood under the climate the map projects. Flood maps are served only where their licence allows it, and cover only the areas they were drawn for: a building whose zone is unknown matches none, so an empty result is not evidence of low flood risk. Repeatable or a comma list.
- `seismic_risk_class` (query, array of RsI | RsII | RsIII | RsIV | U1 | U2 | U3 | consolidated): Keep buildings an official list of technically assessed buildings gives any of these seismic risk classes: `RsI` (the highest risk) to `RsIV`, the urgency classes `U1` (the most urgent) to `U3` older assessments set, or `consolidated` (strengthened since). Only buildings on such a list, such as Bucharest's, have a class: a building on no list matches none, which says nothing of its risk. Repeatable or a comma list.

```sh
curl "https://api.baseray.ai/v1/buildings?bbox=25.55,45.60,25.68,45.70&sort=volume&limit=25&offset=0&category=residential_house&building_type=&roof_shape=gabled&address_corroboration=corroborated&measured_height_only=false&solar_presence=registered&exclude_solar_presence=registered&existing_solar_panels=detected&has_solar_potential=false&has_3d_model=false&has_registered_business=false&registered_business_turnover_currency=RON&has_annual_heating_estimate=false&has_thermal_assessment=false&has_peak_heat_load=false&has_recent_climate_trend=false&has_recent_temperature_extremes=false&has_recent_precipitation=false&flood_zone=5_year&seismic_risk_class=RsI" \
  -H "Authorization: Bearer $BASERAY_API_KEY"
```

Response 200:

```json
{
  "data": [
    {
      "building_id": "c9eefd1b-8c8d-48fe-8b72-e015374d7720",
      "address": "Bulevardul 15 Noiembrie 78",
      "nearest_road": null,
      "address_evidence": "address_record",
      "address_corroboration": "single_source",
      "postal_code": null,
      "locality": "Brașov",
      "country": "RO",
      "latitude": 45.64988,
      "longitude": 25.61044,
      "category": "commercial",
      "category_evidence": "confirmed",
      "building_type": "retail",
      "roof_shape": "flat",
      "footprint_area_m2": 31252,
      "height": {
        "metres": 18,
        "basis": "estimated"
      },
      "volume_m3": 562531,
      "volume_basis": "estimated",
      "floor_area": {
        "square_metres": 500032,
        "basis": "estimated",
        "scope": "gross_above_ground"
      },
      "floors": 16,
      "floors_including_underground": null,
      "construction_year": null,
      "completed_by_year": null,
      "dwellings": null,
      "existing_solar_panels": {
        "status": "none_seen",
        "photo_date": "2022-09-08",
        "confidence": 0.988,
        "analysed_on": null,
        "photo_resolution_cm": null
      },
      "solar_presence": "none_seen",
      "registered_solar": null,
      "solar_potential": null,
      "registered_business_count": 0,
      "registered_business_employees": null,
      "registered_business_turnover": null,
      "flood_zone": null,
      "flood_zone_mapped": false,
      "flood_zone_source": null,
      "seismic_design_acceleration_g": null,
      "seismic_risk_class": null,
      "seismic_risk_assessment_year": null,
      "owner_type": null,
      "app_url": "https://app.baseray.tech/?building=c9eefd1b-8c8d-48fe-8b72-e015374d7720"
    }
  ],
  "meta": {
    "total": 1,
    "total_is_capped": false,
    "limit": 25,
    "offset": 0,
    "sort": "volume"
  },
  "links": {
    "next": null
  }
}
```

## Buildings at a point

`GET /buildings/at` · https://baseray.tech/docs/api/find-buildings-at-point

The buildings whose outline lies within `radius_m` of a point, nearest first. An area outside the countries baseray covers answers with no buildings; https://baseray.tech/countries lists them and takes requests for others.

Parameters:

- `lat` (query, number, required, -90–90): Latitude of the point, WGS84.
- `lon` (query, number, required, -180–180): Longitude of the point, WGS84.
- `radius_m` (query, number, 1–200, default 25): How far from the point to look, in metres.
- `limit` (query, integer, 1–25, default 10): How many buildings to return, nearest first.

```sh
curl "https://api.baseray.ai/v1/buildings/at?lat=45.64988&lon=25.61044&radius_m=25&limit=10" \
  -H "Authorization: Bearer $BASERAY_API_KEY"
```

Response 200:

```json
{
  "data": [
    {
      "building_id": "c9eefd1b-8c8d-48fe-8b72-e015374d7720",
      "address": "Bulevardul 15 Noiembrie 78",
      "nearest_road": null,
      "address_evidence": "address_record",
      "address_corroboration": "single_source",
      "postal_code": null,
      "locality": "Brașov",
      "country": "RO",
      "latitude": 45.64988,
      "longitude": 25.61044,
      "category": "commercial",
      "category_evidence": "confirmed",
      "building_type": "retail",
      "roof_shape": "flat",
      "footprint_area_m2": 31252,
      "height": {
        "metres": 18,
        "basis": "estimated"
      },
      "volume_m3": 562531,
      "volume_basis": "estimated",
      "floor_area": {
        "square_metres": 500032,
        "basis": "estimated",
        "scope": "gross_above_ground"
      },
      "floors": 16,
      "floors_including_underground": null,
      "construction_year": null,
      "completed_by_year": null,
      "dwellings": null,
      "existing_solar_panels": {
        "status": "none_seen",
        "photo_date": "2022-09-08",
        "confidence": 0.988,
        "analysed_on": null,
        "photo_resolution_cm": null
      },
      "solar_presence": "none_seen",
      "registered_solar": null,
      "solar_potential": null,
      "registered_business_count": 0,
      "registered_business_employees": null,
      "registered_business_turnover": null,
      "flood_zone": null,
      "flood_zone_mapped": false,
      "flood_zone_source": null,
      "seismic_design_acceleration_g": null,
      "seismic_risk_class": null,
      "seismic_risk_assessment_year": null,
      "owner_type": null,
      "app_url": "https://app.baseray.tech/?building=c9eefd1b-8c8d-48fe-8b72-e015374d7720"
    }
  ]
}
```

## One building

`GET /buildings/{building_id}` · https://baseray.tech/docs/api/get-building

One building's whole record, as the baseray app's building panel shows it: the building itself, its addresses (each entrance with the dwellings behind it), what its register record says of its units floor by floor and kind by kind, the whole record as its register lays it out, the roof analysis plane by plane, the local climate with its heating degree-days and warming trend, gas and district-heating network evidence, and the heating estimate. A building the catalogue no longer holds is still returned with `is_current` false and, where one now stands on its ground, `replaced_by_building_id`.

Parameters:

- `building_id` (path, string (uuid), required): The building's baseray id, a UUID returned by the other building endpoints.

```sh
curl "https://api.baseray.ai/v1/buildings/c9eefd1b-8c8d-48fe-8b72-e015374d7720" \
  -H "Authorization: Bearer $BASERAY_API_KEY"
```

Response 200:

```json
{
  "data": {
    "building_id": "c9eefd1b-8c8d-48fe-8b72-e015374d7720",
    "address": "Bulevardul 15 Noiembrie 78",
    "nearest_road": null,
    "address_evidence": "address_record",
    "address_corroboration": "single_source",
    "postal_code": null,
    "locality": "Brașov",
    "country": "RO",
    "latitude": 45.64988,
    "longitude": 25.61044,
    "category": "commercial",
    "category_evidence": "confirmed",
    "building_type": "retail",
    "roof_shape": "flat",
    "footprint_area_m2": 31252,
    "height": {
      "metres": 18,
      "basis": "estimated"
    },
    "volume_m3": 562531,
    "volume_basis": "estimated",
    "floor_area": {
      "square_metres": 500032,
      "basis": "estimated",
      "scope": "gross_above_ground"
    },
    "floors": 16,
    "floors_including_underground": null,
    "construction_year": null,
    "completed_by_year": null,
    "dwellings": null,
    "existing_solar_panels": {
      "status": "none_seen",
      "photo_date": "2022-09-08",
      "confidence": 0.988,
      "analysed_on": null,
      "photo_resolution_cm": null
    },
    "solar_presence": "none_seen",
    "registered_solar": null,
    "solar_potential": null,
    "registered_business_count": 0,
    "registered_business_employees": null,
    "registered_business_turnover": null,
    "flood_zone": null,
    "flood_zone_mapped": false,
    "flood_zone_source": null,
    "seismic_design_acceleration_g": null,
    "seismic_risk_class": null,
    "seismic_risk_assessment_year": null,
    "owner_type": null,
    "app_url": "https://app.baseray.tech/?building=c9eefd1b-8c8d-48fe-8b72-e015374d7720",
    "entrances": null,
    "stated_facts": [],
    "is_current": true,
    "replaced_by_building_id": null,
    "outline_reference": null,
    "parts": [],
    "eave_height_m": null,
    "has_3d_model": null,
    "addresses": {
      "confirmation": "confirmed",
      "addresses": [
        {
          "line": "Strada Memorandumului 28, bl. A, sc. 1",
          "postal_code": "400114",
          "locality": "Cluj-Napoca",
          "entrance": "1",
          "dwellings_at_entrance": 24,
          "relation": "shown"
        }
      ]
    },
    "units": {
      "listed": 118,
      "listed_dwellings": 96,
      "stated": 118,
      "stated_dwellings": 96,
      "list_is_complete": true,
      "by_floor": [
        {
          "floor_kind": "ground",
          "floor_number": null,
          "units": 22,
          "dwellings": 0
        },
        {
          "floor_kind": "upper",
          "floor_number": 1,
          "units": 24,
          "dwellings": 24
        }
      ],
      "by_kind": [
        {
          "kind": "dwelling",
          "units": 96
        },
        {
          "kind": "commercial",
          "units": 4
        },
        {
          "kind": "storage",
          "units": 18
        }
      ],
      "entrances": [
        "A",
        "B"
      ],
      "entrance_dwellings": []
    },
    "record_sheet": {
      "exists": true,
      "validated": true,
      "cadastral_number": "262812-C1",
      "property_number": null,
      "land_book_number": null,
      "land_book_number_as_filed": "1997/N",
      "read_on": "2026-10-06",
      "sections": [
        {
          "title": "Performance",
          "rows": [
            {
              "label": "Heated floor area",
              "value": 2410.5,
              "unit": "m2"
            }
          ]
        }
      ]
    },
    "roof_analysis": null,
    "climate": {
      "periods": [
        {
          "period": "recent_average",
          "from": "2016",
          "to": "2025",
          "data_through": "2025-12-31",
          "coldest_day_c": -14.2,
          "hottest_day_c": 36.8,
          "frost_days": 92.4,
          "hot_days": 31.5,
          "precipitation_mm": 612.3,
          "wet_days": 104.2,
          "wettest_day_mm": 48.6
        }
      ],
      "heating_degree_days": [
        {
          "period": "standard_normal",
          "from": "1991",
          "to": "2020",
          "degree_days": 3202
        }
      ],
      "temperature_trend_c_per_decade": 0.48
    },
    "energy_networks": [
      {
        "network": "natural_gas",
        "level": "street",
        "present": true,
        "year": 2024
      }
    ],
    "heating_estimate": {
      "useful_heat_kwh_per_year": 182000,
      "useful_heat_low_kwh_per_year": null,
      "useful_heat_high_kwh_per_year": null,
      "useful_heat_kwh_per_m2_per_year": 75.5,
      "heated_floor_area_m2": 2410.5,
      "heated_floor_area_basis": "register_heated_area",
      "useful_heat_kwh_per_dwelling_per_year": 7583,
      "dwelling_count": 24,
      "delivered_energy_kwh_per_year": 214000,
      "expected_energy_kwh_per_year": 196000,
      "peak_heat_load_kw": 96.4,
      "peak_heat_load_basis": "screening_estimate",
      "design_outdoor_temperature_c": -15,
      "hot_water_heat_kwh_per_year": 41000,
      "hot_water_persons": 52.8,
      "hot_water_occupancy_basis": "counted_dwellings",
      "construction_period_is_on_record": true,
      "era_scenarios": [],
      "neighbours_are_measured": true,
      "neighbour_wall_share": 0.18,
      "heat_pump_scenarios": [
        {
          "seasonal_performance_factor": 3,
          "electricity_kwh_per_year": 60667
        }
      ]
    }
  }
}
```

## Businesses registered at a building's address

`GET /buildings/{building_id}/registered-businesses` · https://baseray.tech/docs/api/list-building-registered-businesses

The active businesses whose registered office is the building's exact official address, largest first, at most 25; `meta.total` counts them all. A registered office is never ownership or occupancy. A business its register protects from direct marketing is marked `advertising_protected`: its data may not be used for direct marketing.

Parameters:

- `building_id` (path, string (uuid), required): The building's baseray id, a UUID returned by the other building endpoints.

```sh
curl "https://api.baseray.ai/v1/buildings/c9eefd1b-8c8d-48fe-8b72-e015374d7720/registered-businesses" \
  -H "Authorization: Bearer $BASERAY_API_KEY"
```

Response 200:

```json
{
  "data": [
    {
      "name": "Example Business SRL",
      "registration_number": "00000000",
      "country": "RO",
      "employees": "10–49",
      "employees_stated_for": "FY 2024",
      "advertising_protected": null,
      "natural_person": null,
      "legal_form": null,
      "person_kind": null,
      "ceased_on": null
    }
  ],
  "meta": {
    "total": 1,
    "sources": []
  }
}
```

## A building's units

`GET /buildings/{building_id}/units` · https://baseray.tech/docs/api/list-building-units

The units a building's record lists (flats, shops, parking spaces, storage), each with its number, name or door, its floor as the record words it and as a kind and number, and its entrance, kind, use, area, rooms and cadastral number where the record states them. `unit` finds units by their number or name ("275" finds 275, "Ap. 275" and "Parcare 275", never 1275); without it the list comes a page at a time. `meta.list_is_complete` is false when the record states a total that differs from its list: a unit missing from the list may then still exist. A building with no units listed has unknown units, never none. Costs what opening the building costs: free once opened.

Parameters:

- `building_id` (path, string (uuid), required): The building's baseray id, a UUID returned by the other building endpoints.
- `unit` (query, string, 1–100 characters): The number or name of the unit(s) to find, e.g. `275`, `12A` or `Parcare 3`; 1 to 100 characters.
- `limit` (query, integer, 1–500, default 200): Units per page, 1 to 500. Default 200.
- `offset` (query, integer, 0–100000, default 0): Matched units to skip, 0 to 100,000. Default 0.

```sh
curl "https://api.baseray.ai/v1/buildings/c9eefd1b-8c8d-48fe-8b72-e015374d7720/units?unit=275&limit=200&offset=0" \
  -H "Authorization: Bearer $BASERAY_API_KEY"
```

Response 200:

```json
{
  "data": [
    {
      "designation": "275",
      "floor": "ETAJ 7",
      "floor_kind": "upper",
      "floor_number": 7,
      "entrance": "B",
      "kind": "dwelling",
      "use": "locuinta",
      "area_m2": 54.2,
      "rooms": 2,
      "cadastral_number": null
    }
  ],
  "meta": {
    "listed": 736,
    "stated": 736,
    "list_is_complete": true,
    "matched": 1,
    "limit": 200,
    "offset": 0
  },
  "links": {
    "next": null
  }
}
```

## This document

`GET /openapi.json` · https://baseray.tech/docs/api/get-open-api-document

The OpenAPI 3.1 document of this API. Public and cacheable (`Cache-Control: public, max-age=3600`, `ETag`).


```sh
curl "https://api.baseray.ai/v1/openapi.json"
```

Response 200:

```json
{}
```

## One building's public page

`GET /public/buildings/{building_id}` · https://baseray.tech/docs/api/get-public-building

The public facts of one building that has a public page: in Czechia an addressed building whose register gives its floors, completion date and use; in Romania an addressed building whose register gives at least two of floors, construction year and floor area. Any other building answers 404. A retired building whose replacement has a public page answers 301: its page moved for good to that one.

Parameters:

- `building_id` (path, string (uuid), required): The building's baseray id.

```sh
curl "https://api.baseray.ai/v1/public/buildings/c9eefd1b-8c8d-48fe-8b72-e015374d7720"
```

Response 200:

```json
{
  "id": "c9eefd1b-8c8d-48fe-8b72-e015374d7720",
  "country": "cz",
  "slug": "praha-vinohradska-12",
  "address": {
    "street": "Vinohradská",
    "number": "12",
    "locality": "Praha",
    "district": "Praha 2",
    "county": "Hlavní město Praha",
    "postcode": "12000",
    "label": "Vinohradská 1200/12, 120 00 Praha 2"
  },
  "facts": {
    "use": {
      "value": "residential_multi",
      "label": "Bytový dům",
      "estimate": false
    },
    "floors": {
      "value": 6,
      "estimate": false,
      "includesUnderground": false
    },
    "built": {
      "year": null,
      "era": "1919–1945",
      "estimate": false
    },
    "footprintArea": {
      "value": 412.5,
      "unit": "m2",
      "estimate": false
    },
    "floorArea": {
      "value": null,
      "unit": "m2",
      "scope": null,
      "estimate": false
    },
    "height": {
      "value": 21.4,
      "unit": "m",
      "estimate": false
    },
    "volume": {
      "value": 8800,
      "unit": "m3",
      "estimate": true
    },
    "roofArea": {
      "value": 430,
      "unit": "m2",
      "estimate": true
    },
    "roofShape": {
      "value": "flat",
      "estimate": true
    },
    "dwellings": {
      "value": 24,
      "estimate": false
    },
    "floodZone": null,
    "seismicZone": null,
    "cadastralRef": {
      "value": "1200",
      "officialUrl": "https://nahlizenidokn.cuzk.cz/"
    }
  },
  "outline": {
    "type": "Polygon",
    "coordinates": [
      [
        [
          14.4301,
          50.0751
        ],
        [
          14.4305,
          50.0751
        ],
        [
          14.4305,
          50.0754
        ],
        [
          14.4301,
          50.0754
        ],
        [
          14.4301,
          50.0751
        ]
      ]
    ]
  },
  "centroid": [
    14.4303,
    50.07525
  ],
  "context": {
    "streetBuildings": 38,
    "olderThanShareOnStreet": 0.71,
    "tallerThanShareInLocality": 0.84
  },
  "place": {
    "country": "cz",
    "slug": "praha",
    "name": "Praha"
  },
  "gated": {
    "solarChecked": true,
    "registeredCompanies": 3
  },
  "updatedAt": "2026-10-01"
}
```

## One building's preview image

`GET /public/buildings/{building_id}/preview.png` · https://baseray.tech/docs/api/get-public-building-preview

A 1200×630 PNG preview of one building that has a public page, for link previews and social cards. Any other building answers 404, as its page does.

Parameters:

- `building_id` (path, string (uuid), required): The building's baseray id.

```sh
curl "https://api.baseray.ai/v1/public/buildings/c9eefd1b-8c8d-48fe-8b72-e015374d7720/preview.png"
```

## One building's 3D model

`GET /public/buildings/{building_id}/model3d` · https://baseray.tech/docs/api/get-public-building-model3-d

What one building that has a public page is drawn in 3D from. A shell is served (`lod2`) only where it was measured from open data, with the credit its licence asks for; a shell measured from paid imagery never is. Otherwise the outline is raised to the height the page shows (`extruded`), or drawn flat where the page shows none (`flat`): no height is ever guessed. Any other building answers 404, as its page does.

Parameters:

- `building_id` (path, string (uuid), required): The building's baseray id.

```sh
curl "https://api.baseray.ai/v1/public/buildings/c9eefd1b-8c8d-48fe-8b72-e015374d7720/model3d"
```

Response 200:

```json
{
  "buildingId": "c9eefd1b-8c8d-48fe-8b72-e015374d7720",
  "kind": "lod2",
  "heightM": 9.6,
  "heightOnRecord": true,
  "source": {
    "label": "Klimadatastyrelsen DHM lidar",
    "licence": "CC BY 4.0",
    "url": "https://datafordeler.dk/dataoversigt/danmarks-hoejdemodel-dhm/"
  },
  "outline": [
    [
      -6.12,
      -4.05
    ],
    [
      6.12,
      -4.05
    ],
    [
      6.12,
      4.05
    ],
    [
      -6.12,
      4.05
    ]
  ],
  "holes": [],
  "mesh": {
    "vertices": [
      [
        -6.12,
        -4.05,
        6.2
      ],
      [
        6.12,
        -4.05,
        6.2
      ],
      [
        6.12,
        4.05,
        6.2
      ],
      [
        -6.12,
        4.05,
        6.2
      ],
      [
        0,
        0,
        9.6
      ]
    ],
    "faces": [
      [
        0,
        1,
        4
      ],
      [
        1,
        2,
        4
      ],
      [
        2,
        3,
        4
      ],
      [
        3,
        0,
        4
      ]
    ]
  }
}
```

## Buildings with a public page

`GET /public/buildings` · https://baseray.tech/docs/api/list-public-buildings

A country's buildings that have a public page, in a stable order, for sitemaps. Follow `nextCursor` until it is null.

Parameters:

- `country` (query, cz | dk | ro, required): `cz` (Czechia) or `ro` (Romania).
- `cursor` (query, string): The `nextCursor` of the previous page; omit for the first page.
- `limit` (query, integer, 1–50000): Buildings per page, at most 50,000.

```sh
curl "https://api.baseray.ai/v1/public/buildings?country=cz&limit=50000"
```

Response 200:

```json
{
  "items": [
    {
      "id": "c9eefd1b-8c8d-48fe-8b72-e015374d7720",
      "slug": "praha-vinohradska-12",
      "updatedAt": "2026-10-01"
    }
  ],
  "nextCursor": "eyJrIjoiYzllZSJ9",
  "total": 2210000
}
```

## Address check

`GET /public/address-search` · https://baseray.tech/docs/api/search-public-addresses

Up to ten addressed buildings matching a text, for the free address check. A building without a public page is returned with `indexable` false.

Parameters:

- `country` (query, cz | dk | ro, required): `cz` (Czechia) or `ro` (Romania).
- `q` (query, string, required): The address text, e.g. `Vinohradská 12`.

```sh
curl "https://api.baseray.ai/v1/public/address-search?country=cz&q=Vinohradsk%C3%A1%2012"
```

Response 200:

```json
{
  "items": [
    {
      "id": "c9eefd1b-8c8d-48fe-8b72-e015374d7720",
      "slug": "praha-vinohradska-12",
      "label": "Vinohradská 1200/12, 120 00 Praha 2",
      "indexable": true
    }
  ]
}
```

## Places with a statistics page

`GET /public/places` · https://baseray.tech/docs/api/list-public-places

A country's towns with a statistics page.

Parameters:

- `country` (query, cz | dk | ro, required): `cz` (Czechia) or `ro` (Romania).

```sh
curl "https://api.baseray.ai/v1/public/places?country=cz"
```

Response 200:

```json
{
  "items": [
    {
      "slug": "iasi",
      "name": "Iași",
      "county": "Iași",
      "buildings": 61234,
      "indexableBuildings": 18000,
      "streets": 412
    }
  ]
}
```

## A place's building statistics

`GET /public/places/{country}/{slug}/stats` · https://baseray.tech/docs/api/get-public-place-statistics

How many buildings a place has, how old and how tall they are, its tallest buildings and rooftop solar counts.

Parameters:

- `country` (path, cz | dk | ro, required): `cz` (Czechia) or `ro` (Romania).
- `slug` (path, string, required): The place's slug, from `/public/places`.

```sh
curl "https://api.baseray.ai/v1/public/places/ro/iasi/stats"
```

Response 200:

```json
{
  "name": "Iași",
  "county": "Iași",
  "buildings": 61234,
  "addressed": 40211,
  "built": {
    "known": 18000,
    "byEra": [
      {
        "era": "before 1945",
        "count": 1200
      }
    ],
    "before1978Share": 0.46
  },
  "floors": {
    "known": 30000,
    "histogram": [
      {
        "floors": "1",
        "count": 21000
      }
    ],
    "blocks4plus": 3100
  },
  "tallest": [
    {
      "id": "c9eefd1b-8c8d-48fe-8b72-e015374d7720",
      "slug": "iasi-palas",
      "height": 72,
      "label": "Strada Palat 1, Iași"
    }
  ],
  "solar": {
    "checkedRoofs": 9000,
    "withPanels": 1450,
    "imageryYears": [
      2023,
      2024
    ]
  },
  "roofAreaTotalM2": 5400000,
  "registeredCompanies": 15400,
  "updatedAt": "2026-10-01"
}
```

## A place's streets with their own page

`GET /public/places/{country}/{slug}/streets` · https://baseray.tech/docs/api/list-public-streets

The place's streets where at least 3 buildings have a public page, by name.

Parameters:

- `country` (path, cz | dk | ro, required): `cz` (Czechia) or `ro` (Romania).
- `slug` (path, string, required): The place's slug, from `/public/places`.

```sh
curl "https://api.baseray.ai/v1/public/places/cz/praha/streets"
```

Response 200:

```json
{
  "items": [
    {
      "slug": "milevska",
      "name": "Milevská",
      "locality": "Praha",
      "buildings": 24,
      "updatedAt": "2026-09-30"
    }
  ]
}
```

## A street's page

`GET /public/places/{country}/{slug}/streets/{street}` · https://baseray.tech/docs/api/get-public-street

One street of a place and every building on it with a public page, by house number.

Parameters:

- `country` (path, cz | dk | ro, required): `cz` (Czechia) or `ro` (Romania).
- `slug` (path, string, required): The place's slug, from `/public/places`.
- `street` (path, string, required): The street's slug, from `/public/places/{country}/{slug}/streets`.

```sh
curl "https://api.baseray.ai/v1/public/places/cz/praha/streets/milevska"
```

Response 200:

```json
{
  "slug": "milevska",
  "name": "Milevská",
  "locality": "Praha",
  "buildings": 24,
  "updatedAt": "2026-09-30",
  "place": {
    "country": "cz",
    "slug": "praha",
    "name": "Praha"
  },
  "county": "Hlavní město Praha",
  "items": [
    {
      "id": "a152dedd-bf51-4bdc-897e-98e1e5e35280",
      "country": "cz",
      "slug": "praha-milevska-2094-3",
      "label": "Milevská 2094/3, Krč, 140 00 Praha 4",
      "number": "2094/3",
      "use": "bytový dům",
      "floors": {
        "value": 33,
        "includesUnderground": true
      },
      "built": {
        "year": 2017,
        "era": null
      }
    }
  ]
}
```

## Streets with their own page

`GET /public/streets` · https://baseray.tech/docs/api/list-public-street-pages

A country's street pages, larger places and longer streets first, for sitemaps. `cursor` is a position: page n of `limit` starts at `cursor=(n−1)·limit`.

Parameters:

- `country` (query, cz | dk | ro, required): `cz` (Czechia) or `ro` (Romania).
- `cursor` (query, string): The `nextCursor` of the previous page (a position); omit for the first page.
- `limit` (query, integer, 1–50000): Streets per page, at most 50,000.

```sh
curl "https://api.baseray.ai/v1/public/streets?country=cz&limit=10000"
```

Response 200:

```json
{
  "items": [
    {
      "place": "praha",
      "slug": "milevska",
      "updatedAt": "2026-09-30"
    }
  ],
  "nextCursor": "10000",
  "total": 74433
}
```

## Request a country

`POST /public/country-requests` · https://baseray.tech/docs/api/request-country

Asks for baseray in a country it does not cover yet, for a person who agrees to be emailed when it does. One request per address and country: asking again changes nothing and answers the same, so the answer never tells whether an address had asked before. A country baseray already covers answers `live` and stores nothing. The address is never shown or shared; product analytics count the country only.


```sh
curl -X POST "https://api.baseray.ai/v1/public/country-requests" \
  -H "Content-Type: application/json" \
  -d '{
  "country": "DE",
  "email": "ana@example.com",
  "consent": true,
  "company": "Example GmbH",
  "use_case": "insurance_underwriting",
  "locale": "en"
}'
```

Response 200:

```json
{
  "status": "live",
  "country": "RO"
}
```

## Ask for a business to be removed

`POST /public/removal-requests` · https://baseray.tech/docs/api/request-removal

Asks for a business to be removed from baseray (GDPR Art. 21), by its country and register number. A business its register makes a person's (a sole trader or personally owned business, or an estate) is removed without a reason asked: from the app, the API, AI assistants, exports, public pages and counts, and it is not imported again while its register lists it. Any other business is decided within 7 days (72 hours when `personal_safety` is true). Customers who exported the business in the past 24 months are asked to delete it. The answer is the same whether or not baseray holds the business.


```sh
curl -X POST "https://api.baseray.ai/v1/public/removal-requests" \
  -H "Content-Type: application/json" \
  -d '{
  "country": "DK",
  "registration_number": "12345678",
  "production_unit_numbers": [
    "1012345678"
  ],
  "email": "owner@example.dk",
  "personal_safety": false,
  "locale": "da"
}'
```

Response 202:

```json
{
  "status": "received",
  "reference": "5b0f3c5e-8f2d-4c1a-9a77-2f6b1d9e4c21"
}
```

## Buy a building's report

`POST /public/building-reports/checkout` · https://baseray.tech/docs/api/start-building-report-checkout

Starts a Stripe Checkout for one building's report, at its final price (tax included) in the currency of the page's language (`locale`): `en` EUR 4.99, `ro` RON 24.99, `cs` CZK 119, `da` DKK 37 (the answer gives `amount` and `currency`), without an account. Sold only for a building whose public page is indexable (enough register facts) and only while Stripe takes live charges. Before paying, Stripe's payment page has the buyer ask for immediate delivery, acknowledge losing the right of withdrawal on delivery and accept the terms (a required box, in the page's language); the order records that consent when it is paid. `consent` is optional: when sent, both must be true. After paying, Checkout returns to the report's page in the app; when abandoned, to `returnPath` on baseray.tech. Limited per visitor (the website names the visitor).


```sh
curl -X POST "https://api.baseray.ai/v1/public/building-reports/checkout" \
  -H "Content-Type: application/json" \
  -d '{
  "buildingId": "c9eefd1b-8c8d-48fe-8b72-e015374d7720",
  "locale": "cs",
  "returnPath": "/cs/budova/praha-vinohradska-12-c9eefd1b-8c8d-48fe-8b72-e015374d7720",
  "attribution": {
    "utmSource": "google",
    "landingPath": "/cs/budova/praha-vinohradska-12-c9eefd1b-8c8d-48fe-8b72-e015374d7720",
    "callToAction": "report_offer"
  },
  "analyticsAnonymousId": "0192f0a1-7c3e-7d2b-9a51-3f0c2e7b8d14",
  "analyticsSessionId": "0192f0a1-7c3e-7d2b-9a51-3f0c2e7b8d15"
}'
```

Response 201:

```json
{
  "checkoutUrl": "https://checkout.stripe.com/c/pay/cs_live_a1B2c3",
  "amount": 11900,
  "currency": "czk"
}
```

## A bought report

`GET /public/building-reports/{token}` · https://baseray.tech/docs/api/get-building-report

The report a token opens. While its Checkout is open the report is first settled from Stripe's current state, so it reads `paid` as soon as Stripe has the payment. A paid report opens its building for 12 months from payment (`accessUntil`). Limited per report: 240 reads a minute with one token, its building's reads included.

Parameters:

- `token` (path, string, required): The report's token: 43 base64url characters, from the report's link (`https://app.baseray.tech/report/{token}`).

```sh
curl "https://api.baseray.ai/v1/public/building-reports/qJ3x9Yb0t2Wc5nVh8kLmZpR4sT6uE1aD7fG0hJ2kL9w"
```

Response 200:

```json
{
  "status": "paid",
  "building": {
    "id": "c9eefd1b-8c8d-48fe-8b72-e015374d7720",
    "country": "cz",
    "title": "Vinohradská 1200/12, 120 00 Praha 2"
  },
  "locale": "cs",
  "paidAt": "2026-10-18T12:00:00+00:00",
  "accessUntil": "2027-10-18T12:00:00+00:00"
}
```

## A report's building record

`GET /public/building-reports/{token}/engine/{path}` · https://baseray.tech/docs/api/get-building-report-engine-read

One record of the report's building, as a workspace that opened it reads it, without a credit: its row (`buildings/search?key={id}`, that key alone, marked `locked: false`), solar figures (`buildings/{id}/solar`), addresses (`buildings/{id}/addresses`), registered businesses (`buildings/{id}/registered-companies`), 3D model (`buildings/{id}/model3d`), register record (`v2/buildings/{id}/register`), the panel detection's photo (`buildings/{id}/solar-panel-detection/proof.jpg`, a JPEG) and the progress of its roof analysis (`buildings/{id}/solar/analysis/stream`, an event stream). Anything else is refused. Limited per report: 240 reads a minute with one token, the report's order included.

Parameters:

- `token` (path, string, required): The report's token: 43 base64url characters, from the report's link (`https://app.baseray.tech/report/{token}`).
- `path` (path, string, required): The building route, with the report's building's id where it carries one.

```sh
curl "https://api.baseray.ai/v1/public/building-reports/qJ3x9Yb0t2Wc5nVh8kLmZpR4sT6uE1aD7fG0hJ2kL9w/engine/buildings/c9eefd1b-8c8d-48fe-8b72-e015374d7720/registered-companies"
```

## Start a report's roof analysis

`POST /public/building-reports/{token}/engine/{path}` · https://baseray.tech/docs/api/start-building-report-roof-analysis

Starts the roof analysis of the report's building (`buildings/{id}/solar/analysis`), as a workspace that opened it starts it, without a credit; follow it with `GET …/engine/buildings/{id}/solar/analysis/stream`. A report includes one run a workspace would be charged a credit for: a second start answers `409 report_analysis_used` without reaching the provider. A start that joins a run already in flight, a run no billable provider answers, or an engine that fails does not use it. Limited per report: 240 requests a minute with one token.

Parameters:

- `token` (path, string, required): The report's token: 43 base64url characters, from the report's link (`https://app.baseray.tech/report/{token}`).
- `path` (path, string, required): The building route, with the report's building's id where it carries one.

```sh
curl -X POST "https://api.baseray.ai/v1/public/building-reports/qJ3x9Yb0t2Wc5nVh8kLmZpR4sT6uE1aD7fG0hJ2kL9w/engine/buildings/c9eefd1b-8c8d-48fe-8b72-e015374d7720/solar/analysis"
```

## Schemas

### Height

- `metres` (number): Height in metres.
- `basis` (measured | stated | estimated): `measured` (the building itself was measured), `stated` (a record gives it: an official building catalogue, crowd mapping or the dataset of the building's outline) or `estimated` (modelled).

### FloorArea

The building's floor area as best known: the figure a record states for the building where one holds, otherwise an estimate.

- `square_metres` (number): Floor area, in m².
- `basis` (measured | stated | estimated or null): `stated` (a record states it for the building) or `estimated` (modelled: the footprint, or a record's built area, times the floors); null when unknown.
- `scope` (gross_whole_building | net_whole_building | gross_full_storeys | gross_above_ground or null): What the figure counts: `gross_whole_building` (every storey, walls included), `net_whole_building` (the usable area of every storey, walls excluded), `gross_full_storeys` (the ground floor and every full storey, walls included; the basement and the attic are not counted) or `gross_above_ground` (the footprint times the floors above ground, walls included); null when unknown.

### ExistingSolarPanels

Whether solar panels are already on the roof, as a dated photo of the roof shows it. This is the photo alone: `solar_presence` settles it with the registers of connected installations, which outrank a photo.

- `status` (detected | none_seen | unclear | not_checked): `detected`, `none_seen`, `unclear`, or `not_checked` (never checked, or the photo was too coarse to check).
- `photo_date` (string (date) or null): Date of the photo checked; null when undated or never checked.
- `confidence` (number or null, 0–1): The check's confidence in its result, 0 to 1; null when not checked.
- `analysed_on` (string (date) or null): The day the photo was checked for panels; null when never checked.
- `photo_resolution_cm` (number or null, ≥ 0): How fine the photo is, in centimetres per pixel; a photo too coarse to check is why a roof stays `not_checked`. Null when not known.

### RegisteredSolar

The solar installations official registers state at the building's address: grid operators' lists of connected installations, energy regulators' generation licences and building registers' installations (`kinds` says which). A register names a site by its address or its building, never a roof, a person or a metering point.

- `installation_count` (integer, ≥ 1): Installations registered at the address.
- `installed_power_kw` (number or null): Installed power in kW: the installations' sum where every one states its own, null otherwise, never a partial sum.
- `export_power_kw` (number or null): Power approved to feed the grid, in kW: the installations' sum where every one states its own, null otherwise.
- `storage_capacity_kwh` (number or null): Energy storage in kWh: the sum where every installation that stores states its capacity, null otherwise; often null even where `has_storage` is true.
- `has_storage` (boolean or null): True where an installation is stated to store energy, false where every installation is stated to store none, null where the register does not say. A register of generation licences does not record storage.
- `first_connected_on` (string (date) or null): The earliest date the installations state; null when not stated, or when a register states only the year (`establishment_year`), which is then given as `first_connected_year` alone. What it dates is in `kinds`: a connection certificate for `grid_connection`, the start of the current holder's licence for `generation_licence`, when the plant may be older.
- `latest_connected_on` (string (date) or null): The latest date the installations state, of the same meaning as `first_connected_on`, and the same date for a single installation.
- `first_connected_year` (integer or null): The year of the earliest date the installations state, given whenever a date is. Where a register states only the year (`establishment_year` in `kinds`) it is the only date given: `first_connected_on` and `latest_connected_on` are then null. Null when nothing is stated.
- `latest_connected_year` (integer or null): The year of the latest date the installations state, of the same meaning as `first_connected_year`, and the same year for a single installation.
- `address_building_count` (integer, ≥ 1): Buildings holding the address the register names, this one included. Of several installations it is the fewest: one at an address the building alone holds is its own.
- `shares_address` (boolean): True when `address_building_count` is above 1: the register then does not say which of the buildings carries the panels.
- `kinds` (array of grid_connection | generation_licence | establishment_year): What the registers record, which says what the dates mean. `grid_connection`: a grid operator's list of connected installations, dated by the connection certificate. `generation_licence`: a regulator's generation licences, dated by the start of the current holder's licence, so the plant may be older and the date is never when it was installed. `establishment_year`: a building register's installations, dated by the year the installation was established as an owner or a municipality states it, never by its connection; only the year is stated, so the dates are null and only `first_connected_year` and `latest_connected_year` are given. Usually one kind; empty only when the kind could not be read.
- `reported_through` (string (date)): The last day of the latest month the registers report: an installation entered after it is not yet listed.

### SolarPotential

Rooftop solar potential, present only where the roof has been modelled.

- `max_panel_count` (integer or null): Solar panels that fit on the roof.
- `max_capacity_kwp` (number or null): Capacity of those panels, in kWp.
- `yearly_energy_kwh` (number or null): Energy they would produce in a year, in kWh.
- `usable_roof_area_m2` (number or null): Roof area usable for panels, in m².
- `co2_savings_kg_per_year` (number or null): CO₂ the installation would save, in kg a year.
- `basis` (measured | measured_cut_to_outline | estimated or null): `measured` where the figures come from the roof itself as measured: a surface model read over it, or roof planes an open survey measured on the building (`roof_analysis.roof_survey` says how). `measured_cut_to_outline` where the measured roof took in the roofs attached to the building (a terraced or semi-detached house) and was cut to the building's outline: its planes and panels were measured, but each is kept or dropped whole by where its centre lies, so the figures approximate the building's own part. `estimated` where they are modelled from the footprint and sunshine. Null when not said.

### StatedFact

One thing the building's record states, as the record words it.

- `fact` (string): What the fact is, e.g. `use`, `construction_year`, `completed_by_year` (the year a building stood by, where it is dated only by a period ending then), `floors_above_ground`, `floors_below_ground`, `built_up_area`, `floor_area`, `enclosed_volume`, `dwelling_count`, `unit_count`, `heating`, `cadastral_number` or `land_book_number_as_filed` (a land book number as written into the register when the building was filed: unverified, never the land book in force). New kinds of fact may appear; treat an unknown one by its `label`.
- `label` (string): The fact's name, for people.
- `value` (string or number or array of string): A number (a count, a year, or a quantity in `unit`), the record's wording, or its wordings.
- `unit` (string or null): The unit of a quantity: `m2` or `m3`; null for counts, years and wordings.
- `note` (string or null): How the record defines or qualifies the value; null when it adds nothing.

### BuildingPart

One part a building is drawn from: a construction the national building register records, or a structure it does not record.

- `origin` (register | unregistered): `register` (a construction the building register records) or `unregistered` (a structure the register does not record; this says nothing of whether it is permitted).
- `record_reference` (string or null): The register's own reference for the construction's record; null for a part not in the register.
- `label` (string or null): How the register names the construction, e.g. `62847-C1`; null where it names none.
- `outline_reference` (footprint | roof_edge): What the part's outline traces: `footprint` (the walls where they meet the ground, as the register surveys them) or `roof_edge` (the roof seen from above, eaves included).
- `area_m2` (number): The area of the part's outline, in m².

### Turnover

A turnover from a business's latest financial statement on record.

- `amount` (integer): Turnover, in whole units of `currency`.
- `currency` (string or null): ISO 4217 currency of the statement.
- `financial_year` (integer or null): The financial year of the statement.

### BuildingSummary

- `building_id` (string (uuid)): The building's baseray id.
- `address` (string or null): The building's address as a record states it (`address_evidence` says which kind): street and house number, a Romanian village's `nr. 350` where the record names no street, or a Czech municipality and number (`Lhota 25`), with the block where one is given. Null when no address of the building is on record; the nearest named road is then `nearest_road`, never this.
- `nearest_road` (string or null): The named road nearest the building, given only where no address of it is on record (`address` is then null). It helps find the building but is not its address: no house number is known.
- `address_evidence` (address_record | business_listing or null): What kind of record `address` comes from: `address_record` (an address record of the building) or `business_listing` (a listing of a business at the building, not an address record of it). Null when `address` is null or the kind is unknown.
- `address_corroboration` (corroborated | single_source | conflicting or null): How other records back the house number of `address`, as the `address_corroboration` filter reads it: `corroborated` (an independent record gives the same number), `single_source` (only one record) or `conflicting` (another record gives another number). Null without a house number.
- `postal_code` (string or null): The official postcode of the building's address; null when none is on record.
- `locality` (string or null): Town, city or village.
- `country` (string or null): ISO 3166-1 alpha-2 country code.
- `latitude` (number): Latitude of the building's centre, WGS84.
- `longitude` (number): Longitude of the building's centre, WGS84.
- `category` (residential_house | apartment_block | commercial | industrial | public | agricultural | ancillary | unknown): Building category; `ancillary` is an annex or outbuilding.
- `category_evidence` (confirmed | corroborated | inferred | conflicting | unconfirmed): How firmly `category` is known: `confirmed` (an official register states it), `corroborated` (several sources agree), `inferred`, `conflicting` (sources disagree) or `unconfirmed` (always so for `unknown`).
- `building_type` (string or null): The building's granular type where a record states one, as the `building_type` filter reads it, e.g. `office`, `warehouse`, `school`, `apartments`; null when none is stated.
- `roof_shape` (string or null): The roof's shape, as the `roof_shape` filter reads it, e.g. `gabled`, `hipped`, `flat`; null when unknown.
- `footprint_area_m2` (number): Area of the building's outline, in m². It is the ground footprint only where the outline is drawn at the walls (`outline_reference` `footprint` on the building's detail); an outline drawn at the roof's edge (`roof_edge`) takes in the eaves and is larger.
- `height` (Height or any or null): Height; null when unknown.
- `volume_m3` (number or null): Volume, in m³; null when unknown.
- `volume_basis` (measured | estimated or null): Whether the volume is measured or estimated; null with the volume.
- `floor_area` (FloorArea or any or null): Floor area, with what it rests on and what it counts; null when unknown.
- `floors` (integer or null): Floors above ground; null when unknown.
- `floors_including_underground` (integer or null): Only where `floors` is unknown: the floors above and below ground counted together, as a building register states them (Czechia's counts them so, a habitable attic as one). How many of them are above ground is not on record. Null otherwise.
- `construction_year` (integer or null): The year a register states the building was completed; null when none states it.
- `completed_by_year` (integer or null): Where a register dates the building only by a census period: the last year of that period, the year it stood by. Null otherwise.
- `dwellings` (integer or null): Dwellings, where known; null when unknown.
- `existing_solar_panels` (ExistingSolarPanels): Whether solar panels are already on the roof, as a dated photo of the roof shows it. This is the photo alone: `solar_presence` settles it with the registers of connected installations, which outrank a photo.
- `solar_presence` (registered | detected | registered_at_address | none_seen | unclear | unknown): Whether the building carries solar panels, settled across the official registers of connected solar installations and the roof photo of `existing_solar_panels`. A register entry is the stronger evidence: a photo may predate an installation or miss it. `registered`: a register states an installation at the building's address, and the building alone holds that address or its own photo shows the panels. `detected`: panels are seen in the photo and no register states an installation. `registered_at_address`: a register states an installation at an address this building shares with others (`registered_solar.address_building_count` of them) and its photo shows none, so the register does not say which roof carries the panels: not a plain yes. `none_seen`: a photo detailed enough shows no panels and no register states an installation. `unclear`: the photo is unclear and no register states one. `unknown`: neither says. A building no register names is never thereby without solar: an installation may be off the grid, or registered under an address written otherwise. The `solar_presence` and `exclude_solar_presence` filters of `GET /buildings` read this field.
- `registered_solar` (RegisteredSolar or any or null): The solar installations official registers state at the building's address; not null exactly when `solar_presence` is `registered` or `registered_at_address`. Null says nothing of the roof.
- `solar_potential` (SolarPotential or any or null): Rooftop solar potential; null where the roof has not been modelled.
- `registered_business_count` (integer, ≥ 0): Active businesses whose registered office is the building's address. Never ownership or occupancy.
- `registered_business_employees` (string or null): The largest stated size of a business registered at the address, as the `registered_business_employees` sort and filters read it: an exact count (`12`), a band (`10–49`) or an open top band (`1000 or more`); null when none is stated.
- `registered_business_turnover` (Turnover or any or null): The largest latest turnover of a business registered at the address, as the `registered_business_turnover` sort and filters read it; null when none is on record.
- `flood_zone` (5_year | 10_year | 20_year | 50_year | 100_year | 100_year_climate_change | 500_year | 1000_year | 10000_year or null): The most frequently flooded zone of an official flood hazard map the building lies in, named by the return period of its flood; `100_year_climate_change` is the 1-in-100-year flood under the climate the map projects. Null means outside every zone only where `flood_zone_mapped` is true; elsewhere the zone is unknown.
- `flood_zone_mapped` (boolean): True where a served flood hazard map covers the building. Flood maps are served only where their licence allows it; where none covers the building this is false and its flood zone is unknown, never "no flood risk".
- `flood_zone_source` (string or null): The credit and the reading the flood map's publisher requires wherever its zone is shown, such as Denmark's "Kilde: Kystdirektoratet, Kystplanlægger.dk" with its note that the zone is a screening, never an assessment of the property. Null where no served map covers the building, or its publisher requires none.
- `seismic_design_acceleration_g` (number or null): The design peak ground acceleration of the building's site, in g, as the national seismic design code maps it (P100-1/2013 in Romania); null when unknown.
- `seismic_risk_class` (RsI | RsII | RsIII | RsIV | U1 | U2 | U3 | consolidated or null): The seismic risk class an official list of technically assessed buildings gives the building: `RsI` (the highest risk) to `RsIV`, the urgency classes `U1` (the most urgent) to `U3` older assessments set, or `consolidated` (strengthened since). Null when the building is on no such list, which says nothing of its risk.
- `seismic_risk_assessment_year` (integer or null): The year of the assessment that set `seismic_risk_class`; null when not stated.
- `owner_type` (private_person | social_housing | company | association | cooperative_housing | municipality | region | state | other or null): The kind of owner the building's property has on record, never who owns it: `private_person` (private persons or a partnership of them), `social_housing` (a non-profit social housing organisation), `company`, `association` (an association, foundation or self-owned institution), `cooperative_housing` (a housing co-operative), `municipality`, `region`, `state`, or `other` (any other owner, or owners of several of these kinds together; nothing more is on record). Null means unknown: no record states one kind for the building, as for a building divided into flats owned one by one.
- `app_url` (string (uri)): The building in the baseray app.

### BuildingDetail

- `building_id` (string (uuid)): The building's baseray id.
- `address` (string or null): The building's address as a record states it (`address_evidence` says which kind): street and house number, a Romanian village's `nr. 350` where the record names no street, or a Czech municipality and number (`Lhota 25`), with the block where one is given. Null when no address of the building is on record; the nearest named road is then `nearest_road`, never this.
- `nearest_road` (string or null): The named road nearest the building, given only where no address of it is on record (`address` is then null). It helps find the building but is not its address: no house number is known.
- `address_evidence` (address_record | business_listing or null): What kind of record `address` comes from: `address_record` (an address record of the building) or `business_listing` (a listing of a business at the building, not an address record of it). Null when `address` is null or the kind is unknown.
- `address_corroboration` (corroborated | single_source | conflicting or null): How other records back the house number of `address`, as the `address_corroboration` filter reads it: `corroborated` (an independent record gives the same number), `single_source` (only one record) or `conflicting` (another record gives another number). Null without a house number.
- `postal_code` (string or null): The official postcode of the building's address; null when none is on record.
- `locality` (string or null): Town, city or village.
- `country` (string or null): ISO 3166-1 alpha-2 country code.
- `latitude` (number): Latitude of the building's centre, WGS84.
- `longitude` (number): Longitude of the building's centre, WGS84.
- `category` (residential_house | apartment_block | commercial | industrial | public | agricultural | ancillary | unknown): Building category; `ancillary` is an annex or outbuilding.
- `category_evidence` (confirmed | corroborated | inferred | conflicting | unconfirmed): How firmly `category` is known: `confirmed` (an official register states it), `corroborated` (several sources agree), `inferred`, `conflicting` (sources disagree) or `unconfirmed` (always so for `unknown`).
- `building_type` (string or null): The building's granular type where a record states one, as the `building_type` filter reads it, e.g. `office`, `warehouse`, `school`, `apartments`; null when none is stated.
- `roof_shape` (string or null): The roof's shape, as the `roof_shape` filter reads it, e.g. `gabled`, `hipped`, `flat`; null when unknown.
- `footprint_area_m2` (number): Area of the building's outline, in m². It is the ground footprint only where the outline is drawn at the walls (`outline_reference` `footprint` on the building's detail); an outline drawn at the roof's edge (`roof_edge`) takes in the eaves and is larger.
- `height` (Height or any or null): Height; null when unknown.
- `volume_m3` (number or null): Volume, in m³; null when unknown.
- `volume_basis` (measured | estimated or null): Whether the volume is measured or estimated; null with the volume.
- `floor_area` (FloorArea or any or null): Floor area, with what it rests on and what it counts; null when unknown.
- `floors` (integer or null): Floors above ground; null when unknown.
- `floors_including_underground` (integer or null): Only where `floors` is unknown: the floors above and below ground counted together, as a building register states them (Czechia's counts them so, a habitable attic as one). How many of them are above ground is not on record. Null otherwise.
- `construction_year` (integer or null): The year a register states the building was completed; null when none states it.
- `completed_by_year` (integer or null): Where a register dates the building only by a census period: the last year of that period, the year it stood by. Null otherwise.
- `dwellings` (integer or null): Dwellings, where known; null when unknown.
- `existing_solar_panels` (ExistingSolarPanels): Whether solar panels are already on the roof, as a dated photo of the roof shows it. This is the photo alone: `solar_presence` settles it with the registers of connected installations, which outrank a photo.
- `solar_presence` (registered | detected | registered_at_address | none_seen | unclear | unknown): Whether the building carries solar panels, settled across the official registers of connected solar installations and the roof photo of `existing_solar_panels`. A register entry is the stronger evidence: a photo may predate an installation or miss it. `registered`: a register states an installation at the building's address, and the building alone holds that address or its own photo shows the panels. `detected`: panels are seen in the photo and no register states an installation. `registered_at_address`: a register states an installation at an address this building shares with others (`registered_solar.address_building_count` of them) and its photo shows none, so the register does not say which roof carries the panels: not a plain yes. `none_seen`: a photo detailed enough shows no panels and no register states an installation. `unclear`: the photo is unclear and no register states one. `unknown`: neither says. A building no register names is never thereby without solar: an installation may be off the grid, or registered under an address written otherwise. The `solar_presence` and `exclude_solar_presence` filters of `GET /buildings` read this field.
- `registered_solar` (RegisteredSolar or any or null): The solar installations official registers state at the building's address; not null exactly when `solar_presence` is `registered` or `registered_at_address`. Null says nothing of the roof.
- `solar_potential` (SolarPotential or any or null): Rooftop solar potential; null where the roof has not been modelled.
- `registered_business_count` (integer, ≥ 0): Active businesses whose registered office is the building's address. Never ownership or occupancy.
- `registered_business_employees` (string or null): The largest stated size of a business registered at the address, as the `registered_business_employees` sort and filters read it: an exact count (`12`), a band (`10–49`) or an open top band (`1000 or more`); null when none is stated.
- `registered_business_turnover` (Turnover or any or null): The largest latest turnover of a business registered at the address, as the `registered_business_turnover` sort and filters read it; null when none is on record.
- `flood_zone` (5_year | 10_year | 20_year | 50_year | 100_year | 100_year_climate_change | 500_year | 1000_year | 10000_year or null): The most frequently flooded zone of an official flood hazard map the building lies in, named by the return period of its flood; `100_year_climate_change` is the 1-in-100-year flood under the climate the map projects. Null means outside every zone only where `flood_zone_mapped` is true; elsewhere the zone is unknown.
- `flood_zone_mapped` (boolean): True where a served flood hazard map covers the building. Flood maps are served only where their licence allows it; where none covers the building this is false and its flood zone is unknown, never "no flood risk".
- `flood_zone_source` (string or null): The credit and the reading the flood map's publisher requires wherever its zone is shown, such as Denmark's "Kilde: Kystdirektoratet, Kystplanlægger.dk" with its note that the zone is a screening, never an assessment of the property. Null where no served map covers the building, or its publisher requires none.
- `seismic_design_acceleration_g` (number or null): The design peak ground acceleration of the building's site, in g, as the national seismic design code maps it (P100-1/2013 in Romania); null when unknown.
- `seismic_risk_class` (RsI | RsII | RsIII | RsIV | U1 | U2 | U3 | consolidated or null): The seismic risk class an official list of technically assessed buildings gives the building: `RsI` (the highest risk) to `RsIV`, the urgency classes `U1` (the most urgent) to `U3` older assessments set, or `consolidated` (strengthened since). Null when the building is on no such list, which says nothing of its risk.
- `seismic_risk_assessment_year` (integer or null): The year of the assessment that set `seismic_risk_class`; null when not stated.
- `owner_type` (private_person | social_housing | company | association | cooperative_housing | municipality | region | state | other or null): The kind of owner the building's property has on record, never who owns it: `private_person` (private persons or a partnership of them), `social_housing` (a non-profit social housing organisation), `company`, `association` (an association, foundation or self-owned institution), `cooperative_housing` (a housing co-operative), `municipality`, `region`, `state`, or `other` (any other owner, or owners of several of these kinds together; nothing more is on record). Null means unknown: no record states one kind for the building, as for a building divided into flats owned one by one.
- `app_url` (string (uri)): The building in the baseray app.
- `entrances` (integer or null): Entrances: each listed address of the building counts as one; null when none are listed.
- `stated_facts` (array of StatedFact): Everything the building's record states, as it words it; empty when no record is on file. A floor area here is the record's own figure; the building's floor area is `floor_area`.
- `is_current` (boolean): False once the building is no longer in the catalogue's current release.
- `replaced_by_building_id` (string (uuid) or null): The building now standing on a retired building's ground, when there is one.
- `outline_reference` (footprint | roof_edge | combined or null): What the building's outline, and so `footprint_area_m2`, traces where the building is drawn from parts: `footprint` (the walls where they meet the ground), `roof_edge` (the roof seen from above, eaves included) or `combined` (parts of both kinds); null where it is not drawn from parts.
- `parts` (array of BuildingPart): The parts the building is drawn from, register parts first, then the largest; empty where it is not drawn from parts.
- `eave_height_m` (number or null, ≥ 0): The height of the eaves; null when unknown.
- `has_3d_model` (boolean or null): Whether a 3D model of the building's roof is on record, reconstructed from a surface model of the roof or from the analysed roof planes; it does not say which. Null when unknown.
- `addresses` (BuildingAddresses or any or null): Every address of the building, each entrance with the dwellings behind it; null when none is on record.
- `units` (UnitsSummary or any or null): What the building's record says of its units; null when it neither lists units nor states how many there are.
- `record_sheet` (RecordSheet or any or null): The building's whole record as its register lays it out; null when no register record is on file.
- `roof_analysis` (RoofAnalysis or any or null): The roof analysis behind `solar_potential`, plane by plane; null when the roof has not been analysed.
- `climate` (Climate or any or null): The local climate; null when none is on record.
- `energy_networks` (array of EnergyNetworkLevel): Gas and district-heating network evidence from the locality down to the building; empty when none is on record.
- `heating_estimate` (HeatingEstimate or any or null): The heating estimate, a model estimate; null when the building is not modelled.

### RegisteredBusiness

Registered office at this address; never ownership or occupancy.

- `name` (string): The business's registered name.
- `registration_number` (string): Its company registration number (a CUI in Romania, an IČO in Czechia, a CVR number in Denmark).
- `country` (string): ISO 3166-1 alpha-2 country of the registration number.
- `employees` (string or null): Employees as stated: an exact count (`12`), a band (`10–49`) or an open top band (`1000 or more`); null when not stated.
- `employees_stated_for` (string or null): When the size was stated: a date, or a financial year such as `FY 2024`.
- `advertising_protected` (boolean or null): True where the business's register protects it from direct marketing (in Denmark, reklamebeskyttelse under CVR-loven § 19: "Reklamebeskyttet – må ikke bruges til direkte markedsføring"): its data may not be used for direct marketing and may be passed on only marked as protected. False where the register states it unprotected; null where the register states nothing of the kind.
- `natural_person` (boolean or null): True where the register's legal form makes the business a person's: a sole proprietorship or personally owned small business, or the estate of a deceased person. Its name is then usually its owner's. Null where the register states no legal form.
- `legal_form` (object or any or null): The legal form as the register codes and words it; null where it states none.
- `person_kind` (personally_owned | estate or null): For a person's business: `personally_owned` ("Personligt ejet virksomhed": a sole proprietorship or personally owned small business) or `estate` ("Dødsbo": the estate of a deceased person). Null for any other business.
- `ceased_on` (string (date) or null): The day a person's business ceased, given only for one still served after it ceased ("Ophørt"); null while it is active.

### PaginationMeta

- `total` (integer, ≥ 0): Buildings matching, counted up to 10,000.
- `total_is_capped` (boolean): True when counting stopped at 10,000; narrow the box for an exact total.
- `limit` (integer): The page size used.
- `offset` (integer): The offset used.
- `sort` (volume | area | height | registered_business_turnover | registered_business_employees): The ranking used.

### Links

- `next` (string (uri) or null): The next page's URL; null on the last page.

### BuildingPage

- `data` (array of BuildingSummary)
- `meta` (PaginationMeta)
- `links` (Links)

### BuildingList

- `data` (array of BuildingSummary): Nearest first.

### BuildingDetailEnvelope

- `data` (BuildingDetail)

### RegisteredBusinessList

- `data` (array of RegisteredBusiness)
- `meta` (object)

### Error

- `error` (object)

### PublicError

The body of every refusal (4xx and 5xx) of the public building pages.

- `error` (not_found | invalid_parameter | rate_limited | unavailable): Stable machine-readable reason.
- `message` (string): What is wrong with the parameter, for `invalid_parameter`.

### PublicBuildingAddress

The building's address, from an address record.

- `street` (string or null): Street name; null for a village address without streets.
- `number` (string or null): House number as the address record writes it.
- `locality` (string or null): Town or village.
- `district` (string or null): City district or sector, where the place has them.
- `county` (string or null): County (Romanian județ, Czech kraj).
- `postcode` (string or null): Postcode; null when none is on record.
- `label` (string): The full address on one line, as it is written locally.

### PublicUseFact

- `value` (string or null): Use code, e.g. `residential_multi`; null when unknown.
- `label` (string or null): The use in the country's own words, e.g. `Bytový dům`.
- `estimate` (boolean): True when the value is modelled rather than taken from a record or a measurement.

### PublicFloorsFact

- `value` (integer or null): Floors; null when unknown.
- `estimate` (boolean): True when the value is modelled rather than taken from a record or a measurement.
- `includesUnderground` (boolean): True when the count includes floors below ground.

### PublicBuiltFact

- `year` (integer or null): Year of completion; null when only the era is known or nothing is.
- `era` (string or null): The period it was built in, e.g. `1919–1945`, where the record gives a period rather than a year.
- `estimate` (boolean): True when the value is modelled rather than taken from a record or a measurement.

### PublicAreaFact

- `value` (number or null): Area in m²; null when unknown.
- `unit` (m2)
- `estimate` (boolean): True when the value is modelled rather than taken from a record or a measurement.

### PublicFloorAreaFact

- `value` (number or null): Floor area in m²; null when unknown.
- `unit` (m2)
- `scope` (usable | gross or null): `usable` (the usable floor area) or `gross` (the built floor area); null when unknown.
- `estimate` (boolean): True when the value is modelled rather than taken from a record or a measurement.

### PublicHeightFact

- `value` (number or null): Height in metres; null when unknown.
- `unit` (m)
- `estimate` (boolean): True when the value is modelled rather than taken from a record or a measurement.

### PublicVolumeFact

- `value` (number or null): Volume in m³; null when unknown.
- `unit` (m3)
- `estimate` (boolean): True when the value is modelled rather than taken from a record or a measurement.

### PublicTextFact

- `value` (string or null): The value; null when unknown.
- `estimate` (boolean): True when the value is modelled rather than taken from a record or a measurement.

### PublicCountFact

- `value` (integer or null): The count; null when unknown.
- `estimate` (boolean): True when the value is modelled rather than taken from a record or a measurement.

### PublicFloodZone

- `value` (string): The flood zone the building lies in.
- `estimate` (false): Always false: the value is taken from an official map.

### PublicSeismicZone

- `designAccelerationG` (number): The design ground acceleration of the building's seismic zone, in g.
- `estimate` (false): Always false: the value is taken from an official map.

### PublicCadastralReference

- `value` (string): The building's official identifier (cadastral number or building code).
- `officialUrl` (string or null): The register's own public page for the building, where it has one.

### PublicBuildingFacts

Each fact is its value or `null` (unknown, never zero), and says whether it is an estimate.

- `use` (PublicUseFact or any or null): What the building is used for.
- `floors` (PublicFloorsFact or any or null): Floors.
- `built` (PublicBuiltFact or any or null): When it was built.
- `footprintArea` (PublicAreaFact or any or null): Area of the building's footprint.
- `floorArea` (PublicFloorAreaFact or any or null): Floor area.
- `height` (PublicHeightFact or any or null): Height.
- `volume` (PublicVolumeFact or any or null): Volume above ground.
- `roofArea` (PublicAreaFact or any or null): Roof area.
- `roofShape` (PublicTextFact or any or null): Roof shape, e.g. `flat` or `gabled`.
- `dwellings` (PublicCountFact or any or null): Dwellings.
- `floodZone` (PublicFloodZone or any or null): The flood zone; null when the building lies in none on record or it is unknown.
- `seismicZone` (PublicSeismicZone or any or null): The seismic zone; null where the country has no seismic zoning on record.
- `cadastralRef` (PublicCadastralReference or any or null): The building's official identifier (cadastral number or building code).

### PublicPolygon

The building's outline as a GeoJSON Polygon.

- `type` (Polygon)
- `coordinates` (array of array of array of number): GeoJSON rings of `[longitude, latitude]` positions in WGS84; the first ring is the outline, any further ones holes.

### PublicBuildingContext

How the building compares with its street and locality; null where too little is known.

- `streetBuildings` (integer or null): Buildings on the same street.
- `olderThanShareOnStreet` (number or null): Share (0–1) of the street's buildings with a known age that this building is older than.
- `tallerThanShareInLocality` (number or null): Share (0–1) of the locality's buildings with a known height that this building is taller than.

### PublicPlaceReference

- `country` (cz | dk | ro)
- `slug` (string): The place's slug, for `/public/places/{country}/{slug}/stats`.
- `name` (string): The place's name.

### PublicGatedCounts

What signing in shows, as counts only.

- `solarChecked` (boolean): True when the roof has been checked for solar panels; the verdict is shown only after signing in.
- `registeredCompanies` (integer): Companies with their registered office at the address; who they are is shown only after signing in. A registered office is not ownership.

### PublicBuilding

One building's public facts.

- `id` (string (uuid)): The building's baseray id, the same as in the rest of this API.
- `country` (cz | dk | ro)
- `slug` (string): A readable slug for the building's page URL, from its locality and address.
- `address` (PublicBuildingAddress): The building's address, from an address record.
- `facts` (PublicBuildingFacts): Each fact is its value or `null` (unknown, never zero), and says whether it is an estimate.
- `outline` (PublicPolygon): The building's outline as a GeoJSON Polygon.
- `centroid` (array of number): `[longitude, latitude]` of the outline's centre, WGS84.
- `context` (PublicBuildingContext): How the building compares with its street and locality; null where too little is known.
- `place` (PublicPlaceReference or any or null): The place whose statistics page the building belongs to; null when it belongs to none.
- `streetPage` (object or any or null): The page of the building's street; null where its street has none.
- `gated` (PublicGatedCounts): What signing in shows, as counts only.
- `updatedAt` (string (date)): When the building's facts last changed.
- `street` (array of PublicNeighbourBuilding): Other buildings with a public page on the same street of the same locality, closest house numbers first; empty without a street.
- `nearby` (array of PublicNeighbourBuilding): The closest other buildings with a public page off that street (within about 600 m), nearest first, each with `distanceM`.
- `surroundings` (array of PublicSurroundingOutline): Outlines of every building within about 65 m of this one, with or without a public page, nearest first.

### PublicBuildingMoved

The body of a 301: where a retired building's page moved.

- `movedTo` (object): The public page a retired building's page moved to.

### PublicModel3DSource

The credit a shell measured from open data carries wherever it is drawn.

- `label` (string): The open dataset the shell was measured from, as its credit names it.
- `licence` (string): The licence the dataset is published under, as people write it (`CC BY 4.0`).
- `url` (string (uri)): The publisher's page of the dataset.

### PublicModel3DMesh

A shell's roof and walls as triangles.

- `vertices` (array of array of number): `[x, y, z]` positions in metres, in the frame of `outline`.
- `faces` (array of array of integer): Triangles, each three indices into `vertices`.

### PublicBuildingModel3D

What a building's public page draws it in 3D from. Positions are in metres about the outline's centroid at ground level (x east, y north, z up), to the centimetre.

- `buildingId` (string (uuid)): The building's baseray id.
- `kind` (lod2 | extruded | flat): `lod2`: a shell measured from open data, in `mesh`. `extruded`: raise `outline` to `heightM`. `flat`: draw `outline` flat; no height is known.
- `heightM` (number or null): The height the building's public page shows, in metres; null where it shows none.
- `heightOnRecord` (boolean): False where `heightM` is an estimate, or null.
- `source` (PublicModel3DSource or any or null): Set for `lod2` only.
- `outline` (array of array of number): The outer ring as `[x, y]` positions, counter-clockwise, without a closing position.
- `holes` (array of array of array of number): Courtyards, each a clockwise ring like `outline`.
- `mesh` (PublicModel3DMesh or any or null): Set for `lod2` only.

### PublicBuildingIndex

One page of a country's buildings that have a public page, in a stable order.

- `items` (array of object)
- `nextCursor` (string or null): Pass as `cursor` for the next page; null on the last one.
- `total` (integer): Buildings with a public page in the country.

### PublicAddressSearchResult

Up to ten addressed buildings matching the text.

- `items` (array of object)

### PublicPlaceList

Towns of at least 2,000 inhabitants or 500 buildings; in Romania municipalities, towns and Bucharest's sectors.

- `items` (array of object)

### PublicPlaceStatistics

One place's building statistics.

- `name` (string)
- `county` (string or null)
- `buildings` (integer)
- `addressed` (integer): Buildings with an address from an address record.
- `built` (object)
- `floors` (object)
- `tallest` (array of object)
- `solar` (object or any or null): Rooftop solar counts; null where no roof in the place has been checked.
- `roofAreaTotalM2` (number): Total roof area in m².
- `registeredCompanies` (integer): Companies with their registered office in the place.
- `updatedAt` (string (date))

### PublicStreetList

A place's streets where at least 3 buildings have a public page, by name.

- `items` (array of object)

### PublicStreet

One street's page: the street, its place and its buildings.

- `slug` (string): For `/public/places/{country}/{slug}/streets/{street}`.
- `name` (string): The street's name as its records write it most.
- `locality` (string or null): The town or village the street is in, where the place holds several.
- `buildings` (integer): Buildings on the street with a public page.
- `updatedAt` (string (date)): When one of its buildings' facts last changed.
- `place` (PublicPlaceReference)
- `county` (string or null)
- `items` (array of PublicNeighbourBuilding): Every building on the street with a public page, by house number.

### PublicStreetIndex

One page of a country's street pages, larger places and longer streets first.

- `items` (array of object)
- `nextCursor` (string or null): Pass as `cursor` for the next page; null on the last one.
- `total` (integer): Street pages in the country.

### PublicNeighbourBuilding

Another building with a public page, listed as a link: its own register facts as its page states them.

- `id` (string (uuid))
- `country` (cz | dk | ro)
- `slug` (string): Not unique: always put the `id` in URLs.
- `label` (string): Its one-line address, as on its page.
- `number` (string or null)
- `use` (string or null): The register's own wording of its use, in the local language; null where unknown.
- `floors` (object or any or null)
- `built` (object or any or null)
- `distanceM` (number): Metres between the two outlines; only in `nearby`.

### PublicSurroundingOutline

The outline of a building close by, for drawing where the building stands.

- `outline` (PublicPolygon): The building's outline as a GeoJSON Polygon.
- `id` (string (uuid) or null): Set only where that building has a public page.
- `slug` (string or null)
- `sameStreet` (boolean): Its address names the same street in the same locality.

### CountryRequest

- `country` (string): The country asked for: an ISO 3166-1 alpha-2 code, such as `DE`.
- `email` (string (email)): Where to write when baseray covers the country. Compared in lower case: the same address asks for a country once.
- `consent` (true): Must be `true`: the person agrees to be emailed about this country. Kept for 24 months at most and deleted on request (privacy@baseray.ai).
- `company` (string or null): The person's company, up to 200 characters.
- `use_case` (solar_prospecting | heating_upgrades | energy_efficiency | insurance_underwriting | real_estate_prospecting | market_research | other or null): What they want the buildings for.
- `locale` (string or null): The language to write back in, as a two-letter code (`en`, `ro`, `cs`).
- `attribution` (object or null): Where the person came from before asking (first touch), as the website carries it.

### CountryRequestReceipt

The answer to a country request.

- `status` (received | live): `received`: the request is on the list (also when this address had asked before). `live`: baseray already covers the country; nothing was stored.
- `country` (string): The country asked for, upper case.

### RemovalRequest

- `country` (RO | CZ | DK): The country of the business's register: `RO`, `CZ` or `DK`.
- `registration_number` (string): The business's number in its register: a Romanian CUI (2 to 10 digits; a leading `RO` is dropped), a Czech IČO or a Danish CVR number (8 digits each). Spaces, dots and hyphens are ignored.
- `production_unit_numbers` (array of string): Denmark only: the business's production units (P-numbers, 10 digits) to remove with it.
- `email` (string (email) or null): Where to confirm the removal. Optional; kept only until the request is decided.
- `personal_safety` (boolean): True when the person cites a protected address or their safety: the request is then decided within 72 hours.
- `locale` (string or null): The language to confirm in (`en`, `ro`, `cs`, `da`); English otherwise.

### RemovalRequestReceipt

Always `received`, whether or not baseray holds the business, so the answer tells nobody what it holds.

- `status` (received)
- `reference` (string (uuid)): Names the request in a later message to privacy@baseray.ai.

### BuildingReportCheckoutRequest

A building report bought from its building's page.

- `buildingId` (string (uuid)): The building's baseray id.
- `locale` (en | ro | cs | da): The building page's language: Checkout's, the delivery email's, and the currency the report is sold in (`en` EUR, `ro` RON, `cs` CZK, `da` DKK).
- `returnPath` (string): The building's page on baseray.tech in that language, where an abandoned Checkout returns: `/building/`, `/ro/cladire/`, `/cs/budova/` or `/da/bygning/`, then an optional slug and the building's id.
- `consent` (object or null): Optional: Stripe's payment page asks for both before paying. When sent (a box ticked on the website), both must be true.
- `attribution` (object or null): Where the buyer came from before buying (first touch), as a sign-up keeps it.
- `analyticsAnonymousId` (string or null): The visit's product analytics anonymous id (letters, digits, dashes, up to 64); dropped in another shape.
- `analyticsSessionId` (string or null): The visit's product analytics session id (letters, digits, dashes, up to 64); dropped in another shape. With both ids, the report's link carries them (`br_ph`), so its page continues the visit.

### BuildingReportCheckout

A started report Checkout.

- `checkoutUrl` (string (uri)): The Stripe Checkout page to send the buyer to; it expires after an hour.
- `amount` (integer, ≥ 1): The total the buyer pays, tax included, in the currency's minor units (`11900` is CZK 119.00).
- `currency` (eur | ron | czk | dkk): The currency of the page's language, lower-case ISO 4217: `en` eur, `ro` ron, `cs` czk, `da` dkk.

### BuildingReport

A bought building report.

- `status` (pending | paid | expired): `pending` while Checkout is open, `paid`, or `expired` when Checkout closed unpaid.
- `building` (object)
- `locale` (en | ro | cs | da): The language it was bought in.
- `paidAt` (string (date-time) or null)
- `accessUntil` (string (date-time) or null): Until when the report opens its building: 12 months from payment.

### BuildingReportError

A building report endpoint's refusal.

- `code` (invalid_parameter | consent_required | not_found | report_unavailable | payments_unavailable | report_not_paid | report_access_expired | route_forbidden | report_analysis_used | rate_limited | upstream_unavailable)
- `message` (string)
- `parameter` (string): The body field at fault, for `invalid_parameter` and `consent_required`.

### BuildingAddress

One address of the building, written once however many records write it: the shown address, a block's entrance, or a corner building's front on another street. Which record gives it is never named.

- `line` (string): The address written the country's way: street and number, then the block (`bl.`) and entrance (`sc.`) where given.
- `postal_code` (string or null): The address's official postcode where one is known, else the one its record writes; null when none is.
- `locality` (string or null): The town or village.
- `entrance` (string or null): The entrance the address names; null for an address that names none.
- `dwellings_at_entrance` (integer or null, ≥ 0): The dwellings counted behind this entrance, never the building's total; null for an address that is no entrance or whose dwellings are not counted.
- `relation` (shown | same_address | different_number | other_street | another_entrance or null): `shown` (the address the building is shown with), `same_address` (another record gives the shown street the same number), `different_number` (another record gives the shown street a different number), `other_street` (the building's front on another street), `another_entrance` (another entrance or number of the building); null when not compared.

### BuildingAddresses

Every address of the building, the shown one first, and whether its records agree on the shown number.

- `confirmation` (confirmed | records_disagree | single_record or null): `confirmed` (several records give the shown street the same number), `records_disagree` (they give it different numbers) or `single_record`; null when no number was compared.
- `addresses` (array of BuildingAddress): Every address, the shown one first.

### FloorUnits

The units the building's record lists on one floor.

- `floor_kind` (basement | semi_basement | ground | upper | attic): Which kind of floor: `basement`, `semi_basement`, `ground`, `upper` or `attic`.
- `floor_number` (integer or null): Basements and upper floors only, counted from 1; null for the others.
- `units` (integer, ≥ 0): The listed units of every kind on the floor.
- `dwellings` (integer, ≥ 0): The listed dwellings among them.

### UnitKindCount

How many of the units the building's record lists are of one kind.

- `kind` (dwelling | commercial | parking | storage | other): `dwelling`, `commercial` (a shop, an office or other business premises), `parking`, `storage` or `other`; a unit the record gives no kind is `other`.
- `units` (integer, ≥ 1): The listed units of that kind.

### EntranceDwellings

The dwellings the building's record counts behind one of its entrances.

- `entrance` (string): The entrance, by its address as the record writes it.
- `dwellings` (integer, ≥ 0): The dwellings counted behind it.

### UnitsSummary

What the building's record says of its units: the units and dwellings it lists, floor by floor and kind by kind, against the totals it states of itself, and the dwellings it counts behind each entrance. The units themselves are read with `GET /buildings/{building_id}/units`.

- `listed` (integer or null, ≥ 1): The units the record lists; null when it lists none, which says nothing of how many there are.
- `listed_dwellings` (integer or null, ≥ 0): The dwellings among the listed units; null when none are listed.
- `stated` (integer or null, ≥ 0): The units the record states the building has; null when it states no total.
- `stated_dwellings` (integer or null, ≥ 0): The dwellings the record states the building has; null when it states no total.
- `list_is_complete` (boolean): True when the record lists units and its list matches every total it states: a unit missing from an incomplete list may still exist.
- `by_floor` (array of FloorUnits or null): The listed units on each floor, bottom to top; a unit whose floor is not known is on none. Null when no units are listed, never to be read as none.
- `by_kind` (array of UnitKindCount or null): The listed units of each kind, kinds the list holds none of left out. Null when no units are listed.
- `entrances` (array of string): The entrances the listed units are reached by, as the record names them, in reading order.
- `entrance_dwellings` (array of EntranceDwellings): The dwellings the record counts behind each entrance; empty when it counts none.

### BuildingUnit

One unit the building's record lists, as the record words it.

- `designation` (string or null): The unit's number, name or door as the record writes it, e.g. `275`, `Parcare 12`.
- `floor` (string or null): The floor as the record words it, e.g. `P`, `ETAJ 7`; null when the record names none for the unit.
- `floor_kind` (basement | semi_basement | ground | upper | attic or null): Which kind of floor it is on; null when not known.
- `floor_number` (integer or null): Basements and upper floors only, counted from 1.
- `entrance` (string or null): The entrance the unit is reached by, as the record names it.
- `kind` (dwelling | commercial | parking | storage | other or null): `dwelling`, `commercial`, `parking`, `storage` or `other`; null when the record gives none.
- `use` (string or null): The use the record states for the unit, in its wording.
- `area_m2` (number or null, ≥ 0): The unit's area as the record states it.
- `rooms` (integer or null, ≥ 0): The rooms the record states.
- `cadastral_number` (string or null): The unit's own cadastral number, where the record keeps one.

### BuildingUnitPageMeta

How the page stands against the building's whole list of units.

- `listed` (integer, ≥ 0): The units the record lists; 0 when it lists none, which says nothing of how many there are.
- `stated` (integer or null, ≥ 0): The units the record states the building has; null when it states no total.
- `list_is_complete` (boolean): True when the record lists units and its list matches every total it states.
- `matched` (integer, ≥ 0): The listed units the answer is about: every one, or those `unit` finds.
- `limit` (integer, ≥ 1): The page size asked for.
- `offset` (integer, ≥ 0): The matched units skipped.

### BuildingUnitPage

One page of the units a building's record lists.

- `data` (array of BuildingUnit): The page of matched units, by number, then by name.
- `meta` (BuildingUnitPageMeta): How the page stands against the building's whole list of units.
- `links` (Links)

### RecordSheetRow

One fact of the building's record, as the record words it.

- `label` (string): The fact's name, or a list entry's own wording.
- `value` (string or number or boolean): The value as the record states it: a wording, a number in `unit`, or a yes or no.
- `unit` (string or null): The unit of a quantity as written, e.g. `m2`, `W/m2K`, `kWh/m2/year`; null for wordings and counts.

### RecordSheetSection

One section of the building's record, as its register lays it out.

- `title` (string): The section's title.
- `rows` (array of RecordSheetRow): The facts in the section.

### RecordSheet

The building's whole record as its register lays it out: its identity numbers, then every fact it states, by section (such as use, areas, storeys, construction, heating and utilities, energy certificate, accessibility). The facts are the record's own, as it words them.

- `exists` (boolean or null): False when the record says the building no longer stands; null where the register keeps no such mark.
- `validated` (boolean or null): Whether the register marks the record checked; null where it keeps no such mark.
- `cadastral_number` (string or null): The building's cadastral number, where the record keeps one.
- `property_number` (string or null): The property number, where the record keeps one.
- `land_book_number` (string or null): Always null: the land book in force is not known. The land book number the register holds, as it was filed, is `land_book_number_as_filed`.
- `land_book_number_as_filed` (string or null): The land book number as written into the register when the building was filed, where it holds one. Free text, not checked against the land book in force: often an old paper land book's number ("447 Ocna Dej"), which may since have closed or been renumbered. Never use it to order a land book extract.
- `read_on` (string (date) or null): The day the record was last read.
- `sections` (array of RecordSheetSection): Every fact on record, by section; empty when the record states none beyond its numbers.

### RoofPlane

One plane of the analysed roof.

- `plane` (integer, ≥ 1): The number the analysis gives the plane.
- `facing` (north | north-east | east | south-east | south | south-west | west | north-west): The compass direction the plane faces.
- `azimuth_degrees` (number): The bearing the plane faces: 0 north, 90 east, 180 south.
- `pitch_degrees` (number): The plane's slope from the horizontal.
- `area_m2` (number, ≥ 0): The plane's area.
- `sunshine_hours_per_year` (number or null, ≥ 0): The sunshine the plane gets in a year; null when not analysed.
- `panels` (integer, ≥ 0): Panels the largest layout puts on the plane.

### RoofAnalysis

The roof analysis behind the building's solar potential (`solar_potential`): the roof's areas and sunshine, the photo it was read from, the panel its layout assumes and the roof plane by plane. Where `planes_are_assumed` is true the planes are an estimate's assumption, not a measurement.

- `whole_roof_area_m2` (number or null, ≥ 0): The whole roof's area.
- `ground_area_m2` (number or null, ≥ 0): The ground the analysed roof covers.
- `peak_sunshine_hours_per_year` (number or null, ≥ 0): Peak sunshine hours a year at the roof.
- `yearly_irradiance_kwh_per_m2` (number or null, ≥ 0): The solar energy a square metre of the roof receives in a year.
- `imagery_date` (string (date) or null): The date of the imagery the roof was read from; null when undated or assumed.
- `imagery_quality` (string or null): The imagery's quality as the analysis grades it.
- `confidence` (number or null, 0–1): The analysis's confidence, 0 to 1.
- `planes_are_assumed` (boolean or null): True where the planes are an estimate's assumption, false where they were measured, null where unsaid.
- `roof_survey` (lidar | image_matching or null): Where the planes were measured on the building by an open survey: how it measured them, `lidar` (airborne laser scanning) or `image_matching` (a point cloud matched from overlapping aerial photographs, which is not lidar). Null where the planes come from no such survey (read from imagery, or assumed) or from a survey baseray does not list.
- `panel_capacity_w` (number or null, ≥ 0): The power of the panel the layout assumes.
- `panel_width_m` (number or null, ≥ 0): The width of that panel.
- `panel_height_m` (number or null, ≥ 0): The height of that panel.
- `planes` (array of RoofPlane): Every plane of the roof, by its number.

### ClimatePeriod

The local climate at the building over one period.

- `period` (latest_year | recent_average | current_year): `latest_year` (the last complete year), `recent_average` (yearly average over the recent years) or `current_year` (this year so far, preliminary).
- `from` (string or null): Where the period starts: a year, or a date for `current_year`.
- `to` (string or null): Where the period ends: a year, or a date for `current_year`.
- `data_through` (string (date) or null): The last day the data covers.
- `coldest_day_c` (number or null): The lowest daily temperature, °C.
- `hottest_day_c` (number or null): The highest daily temperature, °C.
- `frost_days` (number or null, ≥ 0): Days below freezing.
- `hot_days` (number or null, ≥ 0): Hot days.
- `precipitation_mm` (number or null, ≥ 0): Rainfall over the year, mm.
- `wet_days` (number or null, ≥ 0): Wet days.
- `wettest_day_mm` (number or null, ≥ 0): Rainfall on the wettest day, mm.

### HeatingDegreeDays

The heating degree-days of the building's location over one period.

- `period` (standard_normal | recent_average | latest_year): `standard_normal` (the climate normal), `recent_average` (yearly average over the recent years) or `latest_year` (the last complete year).
- `from` (string): The first year of the period.
- `to` (string): The last year of the period.
- `degree_days` (number, ≥ 0): Heating degree-days, K·d.

### Climate

The local climate at the building, from gridded climate data for its location, never an on-site measurement.

- `periods` (array of ClimatePeriod): The temperatures, frost and hot days and rainfall per period; a period with no figure on record is left out.
- `heating_degree_days` (array of HeatingDegreeDays): The heating degree-days per period, the climate normal first; a period not on record is left out.
- `temperature_trend_c_per_decade` (number or null): How fast the location has warmed, °C per decade; null where the trend is not on record or has no clear direction.

### EnergyNetworkLevel

Whether a gas or district-heating network is on record at one level, from the locality down to the building.

- `network` (natural_gas | district_heating): The network.
- `level` (locality | service_area | street | address | building): How close to the building the evidence reaches: the locality, the service area, the street, the address or the building's own connection.
- `present` (boolean): Whether the network is on record at that level.
- `year` (integer or null): The year the evidence refers to.

### HeatingEraScenario

The heat the building would need for space heating had it been built in one construction period.

- `first_year` (integer or null): The period's first year; null for the earliest.
- `last_year` (integer or null): The period's last year; null for the latest.
- `useful_heat_kwh_per_year` (number, ≥ 0): The heat need under that period.
- `is_taken` (boolean): Whether the other figures assume this period.

### HeatPumpScenario

The electricity a heat pump would use for the building's space heating at one seasonal performance factor.

- `seasonal_performance_factor` (number, ≥ 0): The seasonal performance factor assumed.
- `electricity_kwh_per_year` (number or null, ≥ 0): The electricity a year.

### HeatingEstimate

The building's heating estimate. Every figure is a model estimate, never a metered value, an energy certificate or a sizing.

- `useful_heat_kwh_per_year` (number or null): The headline: the heat the building needs in a year for space heating, as it was built (insulated or re-glazed since, it needs less).
- `useful_heat_low_kwh_per_year` (number or null): Where the number of floors is not on record: the lowest need over the floor counts the building may have.
- `useful_heat_high_kwh_per_year` (number or null): Where the number of floors is not on record: the highest need over the floor counts the building may have.
- `useful_heat_kwh_per_m2_per_year` (number or null): The heat need per m² of heated floor area.
- `heated_floor_area_m2` (number or null): The heated floor area the need is worked out on.
- `heated_floor_area_basis` (string or null): What the heated floor area rests on, e.g. `register_heated_area` or `volume_share`.
- `useful_heat_kwh_per_dwelling_per_year` (number or null): The heat need of one dwelling on average, where the dwellings are counted.
- `dwelling_count` (integer or null): The dwellings that figure is per.
- `delivered_energy_kwh_per_year` (number or null): The energy delivered to the heating system for that need.
- `expected_energy_kwh_per_year` (number or null): The energy the building is expected to use for heating.
- `peak_heat_load_kw` (number or null): The peak heat load.
- `peak_heat_load_basis` (string or null): What the peak heat load rests on; `screening_estimate` is an order of magnitude at the standard winter design temperature of the location.
- `design_outdoor_temperature_c` (number or null): The outdoor temperature the peak heat load is worked out at, °C.
- `hot_water_heat_kwh_per_year` (number or null): The heat in the hot water, apart from space heating and in none of the other figures.
- `hot_water_persons` (number or null): The people the hot water is worked out for.
- `hot_water_occupancy_basis` (string or null): Where those people come from: `counted_dwellings`, `one_household` or `heated_floor_area`.
- `construction_period_is_on_record` (boolean or null): False when the construction period behind the estimate is assumed, not read from the building's own record.
- `era_scenarios` (array of HeatingEraScenario): Where the construction year is not on record: the need under each construction period.
- `neighbours_are_measured` (boolean or null): False when the neighbouring buildings were not measured and every wall was taken to face the weather.
- `neighbour_wall_share` (number or null): The share of the walls, 0 to 1, standing against neighbouring buildings; null where they were not measured.
- `heat_pump_scenarios` (array of HeatPumpScenario): The electricity a heat pump would use per seasonal performance factor.
