---
operation_id: list_tilesets_bbox
method: GET
path: /v1/tilesets
summary: 3D-Tiles-Tilesets, die eine WGS84-Bbox schneiden
tags: [tilesets]
stability: stable
since_version: 0.1.0
auth: none
data_product: buildings
snapshot_aware: true
attribution_block: true
rate_limit_tier: public
related:
  - /v1/tilesets/{tileset_id}
  - /v1/tilesets/{tileset_id}/tileset.json
  - /v1/buildings
---
# `GET /v1/tilesets` — 3D-Tiles per Bbox

Liefert alle 3D-Tiles-1.1-Tilesets, deren Bounding-Volume die angegebene WGS84-Bbox schneidet. Ein Tileset = ein Bundesland-Snapshot. Die zurückgelieferte `tileset_url` ist direkt für `Cesium3DTileset.fromUrl(...)` verwendbar — kein weiterer API-Roundtrip nötig.

## Wann verwenden

- Beim Initialisieren eines 3D-Viewers: welche Tilesets musst du laden?
- Beim Wechsel der Karten-Region: nachladen, wenn neue BL ins Sichtfeld wandern.
- Discovery-Endpoint für Cross-BL-Apps (mehrere Tilesets gleichzeitig laden).

## Examples

### curl

```bash
curl -s 'https://api.lodapi.de/v1/tilesets?bbox=8.5,50.0,8.8,50.2' | jq '.tilesets[] | {bl: .bundesland_code, url: .tileset_url, count: .building_count}'
```

### Cesium (TypeScript)

```ts
const r = await fetch("https://api.lodapi.de/v1/tilesets?bbox=8.5,50.0,8.8,50.2");
const { tilesets } = await r.json();
for (const t of tilesets) {
  const ts = await Cesium.Cesium3DTileset.fromUrl(t.tileset_url);
  viewer.scene.primitives.add(ts);
}
```

### MapLibre + Deck.gl (TypeScript)

```ts
import { Tiles3DLayer } from "@deck.gl/geo-layers";
const r = await fetch("https://api.lodapi.de/v1/tilesets?bbox=...");
const { tilesets } = await r.json();
const layers = tilesets.map(t => new Tiles3DLayer({ id: t.tileset_id, data: t.tileset_url }));
```

## Parameters

| Parameter | In | Type | Required | Beschreibung |
|---|---|---|---|---|
| `bbox` | query | string | yes | WGS84 `minLon,minLat,maxLon,maxLat` (Komma-separiert) |

## Response

`200 OK · application/json` — Schema in [`openapi.json`](../openapi/openapi.json) (`#/components/schemas/TilesetListResponse`).

```json
{
  "tilesets": [
    {
      "tileset_id": "f4b...",
      "region_code": "he",
      "bundesland_code": "he",
      "snapshot_date": "2026-04-15",
      "s3_key": "s3://lodapi-tiles/he/2026-04-15/tileset.json",
      "tileset_url": "https://tiles.lodapi.de/he/2026-04-15/tileset.json",
      "tile_count": 21785,
      "total_bytes": 731000000,
      "building_count": 4934236,
      "generated_at": "2026-05-13T17:42:00Z",
      "bounding_volume": { "type": "Polygon", "coordinates": [...] }
    }
  ],
  "count": 1,
  "bbox": [8.5, 50.0, 8.8, 50.2],
  "lodapi": { "attribution": [{ "source": "HLBG", "license": "DL-DE/Zero 2.0", ... }] }
}
```

### Antwort-Header

| Header | Wert |
|---|---|
| `Cache-Control` | `public, max-age=300` |

## Attribution

`lodapi.attribution[]` enthält einen Eintrag pro zurückgegebenes BL. Frontends müssen den `source`-String anzeigen, wenn `license != DL-DE/Zero 2.0`. Siehe [Attribution-Guide](../guides/attribution.md).

## Stolperdrähte

- **`bounding_volume`** ist GeoJSON-Polygon (kein 3D-Tiles-Bounding-Volume-Format). Nützlich für Map-Vorschauen, nicht für 3D-Frustum-Culling.
- **Mehrere Tilesets pro BL**: möglich bei Mehrsnapshot-Coverage. Aktuell liefert die API nur den jüngsten Snapshot pro BL.
- **bbox-Schneiden vs. -Enthalten**: ST_Intersects, nicht ST_Contains. Ein Tileset, das die bbox nur am Rand kratzt, ist enthalten.

## Verwandte Endpoints

- [`GET /v1/tilesets/{tileset_id}`](./get-tileset.md) — Detail per ID.
- [`GET /v1/tilesets/{tileset_id}/tileset.json`](./redirect-tileset-json.md) — direkt zum tileset.json.
- [`GET /v1/buildings`](./list-buildings-bbox.md) — föderierte Feature-Query als Alternative.