Geo API für amtliche Geodaten
Die Kartenwerk Geo API erschließt den Katalog amtlicher OGC-Dienste aller 16 Bundesländer und vereinheitlicht Objektabfragen aus WFS-Diensten als GeoJSON. Diese Referenz beschreibt Authentifizierung, Endpunkte, Seitennavigation und Lizenzangaben.
Sie möchten zuerst verstehen, welchen praktischen Aufwand der gemeinsame Zugang spart? Der Beitrag „Geo API für amtliche Geodaten: 16 Bundesländer, ein Zugang“ erklärt Nutzen, Zielgruppen und Grenzen ohne technische Details.
Maschinenlesbare OpenAPI-Spezifikation
Für SDK-Generatoren, API-Clients und KI-Agenten steht die Metadatenebene zusätzlich als OpenAPI 3.1 bereit. Das Dokument beschreibt Endpunkte, Parameter, Authentifizierung und Antwortschemata. Der Feature-Host bleibt bewusst dynamisch: Verwenden Sie immer die absolute features_url aus der Ticketantwort.
Grundlagen
Regionen, Ebenen, Ebenendetails und Tickets.
Der API-Key gilt für die vier Metadaten-Endpunkte.
Fünf Minuten gültig und auf Ebenen sowie Ziel-CRS begrenzt.
Alle Anfragen und Antworten verwenden JSON. Erfolgreiche Antworten tragenschema_version: 1. Für die Metadaten-Endpunkte wird der langfristige API-Key gesendet; für Feature-Abfragen das zuvor ausgestellte Ticket.
Die Feature-Schnittstelle kann auf einem anderen Host liegen. Verwenden Sie deshalb immer links.features aus dem Ebenendetail oder features_url aus der Ticketantwort und speichern Sie den Host nicht fest im Client.
Schnellstart
Die folgenden Aufrufe zeigen den vollständigen Ablauf: Katalog öffnen, eine WFS-Ebene finden, ein Ticket ausstellen und Features abrufen. Benötigt werden curl und jq.
1. Bundesländer abrufen
export KARTENWERK_API_KEY="ak_…" curl --fail --silent --show-error \ -H "Authorization: Bearer $KARTENWERK_API_KEY" \ "https://kartenwerk.co/api/v1/geo/regions?limit=16"2. WFS-Ebene suchen
Das Beispiel sucht Flurstücksebenen in Nordrhein-Westfalen.
curl --fail --silent --show-error \ -H "Authorization: Bearer $KARTENWERK_API_KEY" \ "https://kartenwerk.co/api/v1/geo/regions/DE-NW/layers?protocol=wfs&search=flurstueck&limit=20"3. Ticket ausstellen
Eine Ebenen-ID hat die Form
geo1.STATE.base64url(service_url).base64url(layer_name). Die beiden Base64url-Teile werden ohne Padding aus den unveränderten UTF-8-Werten der Katalogantwort gebildet. Für den Schnellstart verwenden wir die im vorherigen Schritt gesuchte NRW-Flurstücksebene.export LAYER_ID="geo1.DE-NW.aHR0cHM6Ly93d3cud2ZzLm5ydy5kZS9nZW9iYXNpcy93ZnNfbndfYWxraXNfYWFhLW1vZGVsbC1iYXNpZXJ0.YWR2OkFYX0ZsdXJzdHVlY2s" TICKET_RESPONSE=$(curl --fail --silent --show-error \ --request POST \ -H "Authorization: Bearer $KARTENWERK_API_KEY" \ -H "Content-Type: application/json" \ "https://kartenwerk.co/api/v1/geo/tickets" \ --data "{"layer_ids":["$LAYER_ID"],"target_crs":"EPSG:25832"}") export TICKET=$(printf '%s' "$TICKET_RESPONSE" | jq -r '.token') export FEATURES_URL=$(printf '%s' "$TICKET_RESPONSE" | jq -r '.layers[0].features_url')4. Features abrufen
Übernehmen Sie
tokenundfeatures_urlaus der Ticketantwort. Das Ziel-CRS muss dem Ticket entsprechen; zu jeder Bounding Box gehört ein explizitesbbox_crs.curl --fail --silent --show-error \ --request POST "$FEATURES_URL" \ -H "Authorization: Bearer $TICKET" \ -H "Content-Type: application/json" \ --data '{ "bbox": [356000, 5645000, 357000, 5646000], "bbox_crs": "EPSG:25832", "target_crs": "EPSG:25832", "limit": 1000 }'
Endpunkte
Die vier Metadaten-Endpunkte verwenden den API-Key. Nur die letzte Feature-Abfrage verwendet das Ticket.
/regionsBundesländer und Katalogumfang
Liefert immer die feste Liste aller 16 Bundesländer. Noch nicht katalogisierte Länder erscheinen mit Zählwerten von 0; die Erreichbarkeit ist dann null. catalog_last_harvest_at zeigt, ob überhaupt schon ein Katalogabruf stattgefunden hat.
| Feld | Typ | Bedeutung |
|---|---|---|
| limit | Integer | Seitengröße von 1 bis 50; Standardwert 20. |
| offset | Integer | Startposition ab 0; für die nächste Seite next_offset verwenden. |
Die Antwort enthält pro Land service_count, layer_count, beobachtete Protokolle und den letzten bekannten Erreichbarkeitszeitpunkt.
/regions/{state}/layersEbenen eines Bundeslands
Sucht im geharvesteten Katalog eines Bundeslands. Der Pfadparameter ist ein ISO-3166-2-Code wie DE-NW oder DE-BB.
| Feld | Typ | Bedeutung |
|---|---|---|
| protocol | Enum | Optional: wfs, wms, wcs oder ogcapi. |
| search | String | 2–100 Zeichen; sucht in Ebenenname, Titel und Kurzbeschreibung. |
| include_attributes | Boolean | Standard true; false liefert eine kompaktere Übersicht. |
| include_removed | Boolean | Standard false; schließt nicht mehr angekündigte Ebenen ein. |
| limit | Integer | Seitengröße von 1 bis 50; Standardwert 20. |
| offset | Integer | Startposition ab 0; für die nächste Seite next_offset verwenden. |
Jede Ebene enthält die öffentliche Identität aus Land, exakter Service-URL und Ebenenname sowie CRS, Attribute, Lizenzstatus und Fakten des letzten Katalogabrufs. Eine Ebenen-ID wird deterministisch aus diesen drei Identitätsfeldern gebildet.
const base64url = (value) =>
Buffer.from(value, "utf8").toString("base64url");
const layerId = ({ state, service_url, layer_name }) =>
`geo1.${state}.${base64url(service_url)}.${base64url(layer_name)}`;/layers/{layer_id}Eine Ebene beschreiben
Liefert die vollständigen Katalogmetadaten einer Ebene sowie deren Transportmöglichkeiten. transport nennt das native CRS, unterstützte Ziel-CRS, maximale Seitengröße und bekannte Besonderheiten.
Verwenden Sie die Ebenen-ID als unveränderte, opake Zeichenfolge. Die absolute URL in links.features ist der richtige Zielhost für Feature-Abfragen.
/ticketsFeature-Ticket ausstellen
Tauscht den API-Key gegen ein fünf Minuten gültiges Ticket. Ein Ticket gilt für 1 bis 10 Ebenen, genau ein Ziel-CRS und die in der Antwort genannten Limits. Für die Feature-Abfrage werden derzeit WFS-Ebenen unterstützt.
| Feld | Typ | Bedeutung |
|---|---|---|
| layer_ids | String[] | Pflichtfeld mit 1 bis 10 Ebenen-IDs. |
| target_crs | Enum | EPSG:4326, EPSG:25832 oder EPSG:25833; Standard EPSG:4326. |
Die Antwort enthält token, expires_at, die absoluten Feature-URLs und die wirksamen Mengen-, Größen- und gegebenenfalls Ratenlimits.
{features_url aus der Ticketantwort}WFS-Features als GeoJSON abrufen
Ruft die Ebene live beim Landesdienst ab und liefert eine GeoJSON FeatureCollection zusammen mit Herkunft, Lizenz, Quellenvermerk, Zählerqualität und Warnungen. Authentifiziert wird mit dem Ticket, nicht mit dem langfristigen API-Key.
| Feld | Typ | Bedeutung |
|---|---|---|
| bbox | Number[4] | Optional: [minX, minY, maxX, maxY]. Erfordert bbox_crs. |
| bbox_crs | Enum | CRS der Bounding Box; Pflicht, sobald bbox gesetzt ist. |
| filter | Object | Optional: genau ein Attribut mit eq, like oder in filtern. |
| target_crs | Enum | Muss dem Ziel-CRS des Tickets entsprechen. |
| limit | Integer | 1–10.000; Standard 1.000, zusätzlich durch das Ticket begrenzt. |
| cursor | String | Optional und opak; next_cursor aus der vorherigen Antwort. |
{
"filter": {
"property": "nutzung",
"op": "in",
"value": ["Wohnbaufläche", "Industrie- und Gewerbefläche"]
},
"target_crs": "EPSG:4326",
"limit": 1000
}Paging und Koordinatensysteme
Metadaten
R1 und R2 verwenden Offset-Paging. Setzen Sie für die nächste Seite den gelieferten next_offset-Wert als offset. null markiert die letzte Seite.
Features
Feature-Seiten verwenden einen signierten Cursor. Senden Sie next_cursor unverändert mit denselben Abfrageparametern zurück. Läuft das Ticket ab, stellen Sie ein neues für dieselbe Ebene und dasselbe CRS aus; der Cursor bleibt bis zu 15 Minuten gültig.
Zulässige Eingabe- und Zielsysteme sind EPSG:4326, EPSG:25832 und EPSG:25833. Antworten in EPSG:4326 sind RFC-7946-konformes GeoJSON. Projizierte Antworten tragen zusätzlich ein GeoJSON-CRS-Mitglied, damit GIS-Software die Datei korrekt verortet.
Fehler, Warnungen und Lizenzen
Alle Nicht-2xx-Antworten verwenden dieselbe Struktur. Der Fehler enthält einen stabilen kind, deutsche und englische Meldungen, den HTTP-Status und eine request_id für Supportfälle. Bei 429 oder vorübergehenden Upstreamfehlern kann zusätzlichretry_after_seconds gesetzt sein.
{
"schema_version": 1,
"error": {
"kind": "upstream_timeout",
"message_de": "Der Landesdienst hat nicht rechtzeitig geantwortet.",
"message_en": "The state service did not answer in time.",
"http_status": 504,
"upstream_status": null,
"upstream_message": null,
"retry_after_seconds": 30,
"circuit": {
"state": "half_open",
"retry_at": "2026-08-08T10:15:00.000Z"
},
"request_id": "…"
}
}Erfolgreiche Feature-Antworten können Warnungen tragen, etwa bei ungenauen Upstream-Zählern, abgeschnittenen Seiten, transformierten Koordinaten oder ungeprüfter Lizenz. Behandeln Sie unbekannte Warnungs- und Fehlerarten als erweiterbar: anzeigen oder protokollieren, aber nicht die Verarbeitung einer ansonsten gültigen Antwort abbrechen.
license_status: curated bedeutet, dass Kartenwerk die Lizenzangabe einem geprüften Register zugeordnet hat; dann enthältattribution den zu verwendenden Quellenvermerk. Bei unverified sind Lizenz und Quellenvermerk null und die Antwort trägt license_unverified. Prüfen Sie in diesem Fall vor einer Weiterverwendung die Bedingungen des Landes selbst.
Zugang zur Geo API
Legen Sie ein kostenloses Konto an und erstellen Sie Ihren API-Key selbst unter Einstellungen → Geo API. Der Schlüssel wird dabei genau einmal angezeigt; widerrufen können Sie ihn dort jederzeit.
Selbst erstellte Keys sind auf 10 Anfragen pro Sekunde und 50.000 Anfragen pro Monat begrenzt. Für höhere Limits oder Fragen zum Einsatz schreiben Sie uns.
Stand: · API-Version v1 · Antwortschema 1