API-Referenz
Eine knappe Referenz für die öffentliche GeoPilot-API — jeder unten aufgeführte Endpunkt ist unter /api/v1/public auf der Domain Ihrer GeoPilot-Instanz eingehängt und wird per API-Schlüssel statt per Sitzungscookie authentifiziert.
Wie sich ED-269 und ED-318 Feld für Feld unterscheiden: Lesen Sie den Ratgeber. →
API für Drohnen-Flugverbotszonen: erste Schritte →
So wandeln Sie ED-269- und ED-318-Geozonen in GeoJSON oder KML um →
Maschinenlesbar: die OpenAPI-3.1-Beschreibung →
Änderungsprotokoll
Was sich an der öffentlichen API geändert hat, neueste Einträge zuerst. Eine Änderung wird nur dann als Breaking markiert, wenn sich eine bestehende, korrekt formulierte Anfrage jetzt anders verhält; alles andere ist eine Ergänzung oder eine Korrektur.
Konfliktprüfungen nennen jetzt die ausgelassenen Quellen
Antworten von POST /restrictions/intersect enthalten ein neues Array excludedSources: jede nicht für die API lizenzierte Quelle, deren Beschränkungen die Form ebenfalls berührt, mit einer Anzahl, aber nie die Beschränkungen selbst. Bisher lieferte eine Prüfung in einem solchen Land total: 0, was wie ein freies Gebiet aussah. Jeder Konflikt enthält außerdem sourceAttribution, die Quellenangabe, die Sie bei CC-BY-Daten anzeigen müssen.
OpenAPI-Beschreibung und API-Katalog veröffentlicht
Die öffentliche API ist jetzt als OpenAPI 3.1 unter /api/v1/public/openapi.json beschrieben, erzeugt aus denselben Schemas, mit denen die API Anfragen validiert, und in einem RFC-9727-Katalog unter /.well-known/api-catalog aufgeführt. Ein Liveness-Endpunkt, GET /api/v1/public/health, antwortet ohne Schlüssel. Keine bestehende Anfrage verhält sich anders.
ED-318-Umwandlungen anhand zweier echter Datenquellen korrigiert
Der ED-318-Codec war auf Grundlage des veröffentlichten Schemas gebaut worden, ohne echte Datenquelle zum Abgleich. Er ist jetzt direkt gegen echte Exporte verifiziert, und mehrere Feldzuordnungen waren falsch: die Schreibweise des Genehmigungswerts, wo die Höhe übertragen wird (in der Geometrie, nicht in den Eigenschaften) und wie die Geometrie einer Zone mit mehreren Volumen dargestellt wird. Jede Umwandlung nach oder aus ED-318 — ed269-ed318, kml-ed318, geojson-ed318 und die jeweilige Gegenrichtung — kann für ein echtes ED-318-Dokument eine andere, korrigierte Ausgabe liefern als vor dieser Korrektur.
Einen Schlüssel erhalten
Der API-Zugang ist ein vom Kartenabonnement getrenntes Produkt, wird eigenständig abgerechnet und ist in Selbstbedienung nutzbar, sobald Ihr Konto ihn besitzt.
Neu hier? API-Zugang abonnieren
Möchten Sie vor dem Kauf testen oder benötigen Sie ein individuelles Ratenlimit? Zugang beantragen
Bereits abonniert? Erstellen Sie einen Schlüssel in Ihrem Profil — benennen Sie ihn, wählen Sie nur die Scopes, die Sie brauchen, und kopieren Sie den Rohschlüssel, sobald er angezeigt wird, denn er wird genau einmal angezeigt. API-Schlüssel verwalten
Authentifizierung
Jede Anfrage enthält Ihren Schlüssel als Bearer-Token.
Authorization: Bearer <your-api-key>Zwei Fehlerzustände werden unterschieden:
- Fehlender, fehlerhafter, unbekannter, widerrufener oder abgelaufener Schlüssel — 401 Unauthorized.
- Ein gültiger Schlüssel, dessen Inhaber keinen API-Zugang mehr hat (Abonnement gekündigt oder abgelaufen) — 403 Forbidden.
- Ein gültiger Schlüssel ohne den Scope, den ein Endpunkt verlangt — 403 Forbidden, unter Nennung des fehlenden Scopes.
Scopes
Jeder Schlüssel wird mit einem oder mehreren Scopes erstellt. Eine Anfrage benötigt den Scope, den ihr Endpunkt verlangt, unabhängig davon, ob das Konto überhaupt API-Zugang hat.
- RESTRICTIONS_READ
- Luftraumbeschränkungsdaten lesen — Listen-, Punkt-, Radius- und Einzelabfragen.
- CONFLICT_CHECK
- Ein gezeichnetes Gebiet oder eine Route mit aktiven Beschränkungen abgleichen.
- CONVERT_ED269
- Zwischen ED-269 und GeoJSON umwandeln.
- CONVERT_KML
- Zwischen KML und jedem anderen unterstützten Format umwandeln.
- CONVERT_ED318
- Zwischen ED-318 und jedem anderen unterstützten Format umwandeln.
Ratenlimits
Jedes der folgenden Kontingente wird pro Schlüssel über ein gleitendes Ein-Minuten-Fenster gezählt. Jede Antwort enthält X-RateLimit-Limit und X-RateLimit-Remaining; eine 429 enthält zusätzlich Retry-After.
- Umwandlung
- /convert/ed269-to-geojson, /convert/geojson-to-ed269, /convert/:from-:to
- 60 Anfragen pro Minute (Standard).
- Beschränkungen lesen
- /restrictions, /at, /near, /:id
- 60 Anfragen und 200 MB pro Minute (Standard).
- Konfliktprüfung
- /restrictions/intersect
- 60 Anfragen pro Minute (Standard).
Benötigen Sie für eine bestimmte Integration ein höheres Limit? Zugang beantragen
Fehler
Jeder Fehler — von jedem Endpunkt — hat dieselbe JSON-Form (RFC 9457 „problem details“), sodass Ihr Client einen einzigen Fehlerpfad behandeln kann, statt pro Endpunkt zu raten.
{
"type": "https://geopilot.space/problems/forbidden",
"title": "Insufficient permissions",
"status": 403,
"detail": "This API key does not have the CONFLICT_CHECK scope.",
"instance": "/api/v1/public/restrictions/intersect",
"requestId": "b3f2b8b0-8b7a-4c9b-9c9a-2f6a7a2b6b34"
}errors listet Validierungsfehler auf Feldebene auf und erscheint nur bei einer 400 oder 422.
- 400
- Anfragetext, Abfrage oder Parameter haben die Validierung nicht bestanden.
- 401
- Fehlender, fehlerhafter, unbekannter, widerrufener oder abgelaufener Schlüssel.
- 403
- Der Inhaber des Schlüssels hat keinen aktiven API-Zugang mehr, oder dem Schlüssel fehlt der Scope, den der Endpunkt verlangt.
- 404
- Die angeforderte Ressource existiert nicht oder ist für Ihren Schlüssel nicht sichtbar — siehe den Lizenzhinweis oben.
- 422
- Die übermittelte Geometrie ist ungültig oder zu komplex für eine Auswertung.
- 429
- Ratenlimit überschritten. Versuchen Sie es nach der in Retry-After angegebenen Anzahl Sekunden erneut.
Länder, die die API bedient
Die API liefert nur Daten aus Quellen, deren Herausgeber kommerzielle Weiterverwendung und Weiterverbreitung erlauben, und deckt daher weniger Länder ab als die Karte. Anderswo liefern Abfragen von Beschränkungen nichts, und eine Konfliktprüfung nennt die ausgelassenen Quellen unter excludedSources, statt das Gebiet als frei zu melden.
- Enthalten:
- Australien, Finnland, Luxemburg, Norwegen, Schweiz, Vereinigte Staaten
- Nur auf der Karte (Nutzungsbedingungen nicht geklärt):
- Lettland, Portugal, Rumänien
Endpunkte
Abfragen von Beschränkungen liefern nur Daten aus Quellen, deren Lizenz kommerzielle Nutzung und Weiterverbreitung erlaubt. Eine aus diesem Grund ausgeschlossene Quelle verhält sich so, als existiere sie nicht: GET /restrictions/:id liefert dafür 404, genau wie bei einer unbekannten ID. Die Konfliktprüfung ist die einzige Ausnahme: Sie nennt das Ausgelassene unter excludedSources, damit ein ausgeschlossenes Land nie als frei gemeldet wird.
GET /api/v1/public/restrictions
Scope: RESTRICTIONS_READ
Beschränkungen auflisten, filterbar nach Land, Begrenzungsrahmen, Typ, Wirkung und mehr.
curl "https://geopilot.space/api/v1/public/restrictions?country=FI" \
-H "Authorization: Bearer $GEOPILOT_API_KEY"Antwort
{
"meta": {
"freshness": {
"state": "FRESH",
"sources": [{ "sourceId": "fi-traficom-zones", "state": "FRESH", "lastSyncedAt": "2026-09-01T09:00:00.000Z" }],
"generatedAt": "2026-09-01T12:00:00.000Z"
},
"pagination": { "limit": 1000, "nextCursor": null, "returned": 214, "truncated": false },
"detail": "FULL",
"attributions": ["Source: Finnish Transport and Communications Agency Traficom, licensed under CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Modified by GeoPilot: geometry simplified, zones classified."],
"sources": [
{
"id": "fi-traficom-zones",
"providerKey": "fi-traficom-zones",
"name": "Traficom UAS geographical zones",
"attribution": "Source: Finnish Transport and Communications Agency Traficom, licensed under CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Modified by GeoPilot: geometry simplified, zones classified.",
"sourceTimestamp": "2026-09-01T06:00:00.000Z",
"lastSyncedAt": "2026-09-01T09:00:00.000Z"
}
],
"authorities": [{ "id": "traficom", "name": "Traficom", "phone": null, "email": null, "website": null }],
"evaluatedAt": "2026-09-01T12:00:00.000Z",
"disclaimer": "GeoPilot is an independent planning tool and is not affiliated with or endorsed by any aviation authority. It shows data published by national authorities, which may be incomplete, out of date or simplified in processing, and it does not authorize any flight. Always check the authority's own publication and current NOTAMs before flying."
},
"geojson": {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"id": "3f1b2c4d-0000-4000-8000-000000000000",
"geometry": { "type": "Polygon", "coordinates": [[[24.90,60.29],[25.00,60.29],[25.00,60.35],[24.90,60.35],[24.90,60.29]]] },
"properties": {
"id": "3f1b2c4d-0000-4000-8000-000000000000",
"externalId": "EF-UAS-EXAMPLE",
"countryIso2": "FI",
"name": "Example aerodrome UAS zone",
"description": null,
"type": "RESTRICTED_AREA",
"effect": "AUTHORIZATION_REQUIRED",
"effectBasis": "PROVIDER_RULE",
"status": "ACTIVE",
"lowerLimit": { "meters": 0, "datum": "GND", "raw": "GND", "parsed": true },
"upperLimit": { "meters": 1500, "datum": "AMSL", "raw": "1500 AMSL", "parsed": true },
"activationStart": null,
"activationEnd": null,
"schedule": null,
"activeNow": true,
"sourceId": "fi-traficom-zones",
"authorityId": "traficom",
"firstSeenAt": "2025-01-15T00:00:00.000Z",
"lastSeenAt": "2026-09-01T09:00:00.000Z"
}
}
]
}
}GET /api/v1/public/restrictions/at
Scope: RESTRICTIONS_READ
Alle Beschränkungen in den Daten der API, die sich an einem Punkt überlagern.
curl "https://geopilot.space/api/v1/public/restrictions/at?lat=60.32&lon=24.95" \
-H "Authorization: Bearer $GEOPILOT_API_KEY"Antwort
{
"meta": { "…": "same shape as GET /restrictions, above" },
"geojson": {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"id": "3f1b2c4d-0000-4000-8000-000000000000",
"geometry": { "type": "Polygon", "coordinates": [[[24.90,60.29],[25.00,60.29],[25.00,60.35],[24.90,60.35],[24.90,60.29]]] },
"properties": {
"id": "3f1b2c4d-0000-4000-8000-000000000000",
"externalId": "EF-UAS-EXAMPLE",
"name": "Example aerodrome UAS zone",
"type": "RESTRICTED_AREA",
"effect": "AUTHORIZATION_REQUIRED",
"effectBasis": "PROVIDER_RULE",
"status": "ACTIVE",
"activeNow": true,
"sourceId": "fi-traficom-zones",
"authorityId": "traficom"
}
}
]
}
}GET /api/v1/public/restrictions/near
Scope: RESTRICTIONS_READ
Beschränkungen im Umkreis eines Punkts, die nächstgelegenen zuerst.
curl "https://geopilot.space/api/v1/public/restrictions/near?lat=60.32&lon=24.95&radiusMeters=5000" \
-H "Authorization: Bearer $GEOPILOT_API_KEY"Antwort
{
"meta": { "…": "same shape as GET /restrictions, above" },
"geojson": {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"id": "3f1b2c4d-0000-4000-8000-000000000000",
"geometry": { "type": "Polygon", "coordinates": [[[24.90,60.29],[25.00,60.29],[25.00,60.35],[24.90,60.35],[24.90,60.29]]] },
"properties": {
"id": "3f1b2c4d-0000-4000-8000-000000000000",
"externalId": "EF-UAS-EXAMPLE",
"name": "Example aerodrome UAS zone",
"type": "RESTRICTED_AREA",
"effect": "AUTHORIZATION_REQUIRED",
"effectBasis": "PROVIDER_RULE",
"status": "ACTIVE",
"activeNow": true,
"sourceId": "fi-traficom-zones",
"authorityId": "traficom",
"distanceMeters": 842.6
}
}
]
}
}GET /api/v1/public/restrictions/:id
Scope: RESTRICTIONS_READ
Eine Beschränkung anhand ihrer ID.
curl "https://geopilot.space/api/v1/public/restrictions/3f1b2c4d-0000-4000-8000-000000000000" \
-H "Authorization: Bearer $GEOPILOT_API_KEY"Antwort
{
"type": "Feature",
"id": "3f1b2c4d-0000-4000-8000-000000000000",
"geometry": { "type": "Polygon", "coordinates": [[[24.90,60.29],[25.00,60.29],[25.00,60.35],[24.90,60.35],[24.90,60.29]]] },
"properties": {
"id": "3f1b2c4d-0000-4000-8000-000000000000",
"externalId": "EF-UAS-EXAMPLE",
"countryIso2": "FI",
"name": "Example aerodrome UAS zone",
"description": null,
"type": "RESTRICTED_AREA",
"effect": "AUTHORIZATION_REQUIRED",
"effectBasis": "PROVIDER_RULE",
"status": "ACTIVE",
"lowerLimit": { "meters": 0, "datum": "GND", "raw": "GND", "parsed": true },
"upperLimit": { "meters": 1500, "datum": "AMSL", "raw": "1500 AMSL", "parsed": true },
"activationStart": null,
"activationEnd": null,
"schedule": null,
"activeNow": true,
"authority": { "id": "traficom", "name": "Traficom", "phone": null, "email": null, "website": null },
"source": {
"id": "fi-traficom-zones",
"providerKey": "fi-traficom-zones",
"name": "Traficom UAS geographical zones",
"attribution": "Source: Finnish Transport and Communications Agency Traficom, licensed under CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Modified by GeoPilot: geometry simplified, zones classified.",
"sourceTimestamp": "2026-09-01T06:00:00.000Z",
"lastSyncedAt": "2026-09-01T09:00:00.000Z"
},
"raw": { "…": "the provider's original record, preserved verbatim" },
"firstSeenAt": "2025-01-15T00:00:00.000Z",
"lastSeenAt": "2026-09-01T09:00:00.000Z"
}
}POST /api/v1/public/restrictions/intersect
Scope: CONFLICT_CHECK
Ein Polygon oder eine Route mit aktiven Beschränkungen abgleichen und melden, was berührt wird.
curl -X POST "https://geopilot.space/api/v1/public/restrictions/intersect" \
-H "Authorization: Bearer $GEOPILOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"geometry": {
"type": "Polygon",
"coordinates": [[[24.90,60.29],[25.00,60.29],[25.00,60.35],[24.90,60.35],[24.90,60.29]]]
}
}'Antwort
{
"conflicts": [
{
"restrictionId": "3f1b2c4d-0000-4000-8000-000000000000",
"externalId": "EF-UAS-EXAMPLE",
"name": "Example aerodrome UAS zone",
"type": "RESTRICTED_AREA",
"effect": "AUTHORIZATION_REQUIRED",
"effectBasis": "PROVIDER_RULE",
"authorityName": "Traficom",
"intersectionAreaM2": 482310.5,
"intersectionRatio": 0.61,
"activeAtQueryTime": true,
"sourceName": "Traficom UAS geographical zones",
"sourceAttribution": "Source: Finnish Transport and Communications Agency Traficom, licensed under CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Modified by GeoPilot: geometry simplified, zones classified."
}
],
"summary": { "total": 1, "prohibited": 0, "authorizationRequired": 1, "coordinationRequired": 0, "informationOnly": 0, "unknown": 0 },
"evaluatedAt": "2026-09-01T12:00:00.000Z",
"disclaimer": "GeoPilot is an independent planning tool and is not affiliated with or endorsed by any aviation authority. It shows data published by national authorities, which may be incomplete, out of date or simplified in processing, and it does not authorize any flight. Always check the authority's own publication and current NOTAMs before flying.",
"excludedSources": []
}POST /api/v1/public/convert/ed269-to-geojson
Scope: CONVERT_ED269
Ein veröffentlichtes ED-269-Dokument in eine GeoJSON-FeatureCollection umwandeln.
curl -X POST "https://geopilot.space/api/v1/public/convert/ed269-to-geojson" \
-H "Authorization: Bearer $GEOPILOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "document": { "UASZoneVersion": { "...": "the published ED-269 document" } } }'Antwort
{
"geojson": {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": { "type": "Polygon", "coordinates": [[[26.05,44.40],[26.15,44.40],[26.15,44.47],[26.05,44.47],[26.05,44.40]]] },
"properties": {
"externalId": "ROU-001",
"name": "Example zone",
"description": null,
"type": "OTHER",
"effect": "PROHIBITED",
"effectBasis": "PROVIDER_RULE",
"lowerLimit": { "meters": 0, "datum": "AGL", "display": "0 m AGL" },
"upperLimit": { "meters": 120, "datum": "AGL", "display": "120 m AGL" },
"activationStart": null,
"activationEnd": null,
"schedule": null,
"authorityHint": null
}
}
]
},
"errors": [],
"totalFeatures": 1
}POST /api/v1/public/convert/geojson-to-ed269
Scope: CONVERT_ED269
Ein GeoJSON-Feature oder eine FeatureCollection in ein ED-269-Dokument umwandeln.
curl -X POST "https://geopilot.space/api/v1/public/convert/geojson-to-ed269" \
-H "Authorization: Bearer $GEOPILOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "Feature",
"geometry": { "type": "Polygon", "coordinates": [[[26.05,44.40],[26.15,44.40],[26.15,44.47],[26.05,44.47],[26.05,44.40]]] },
"properties": { "name": "Example zone", "effect": "PROHIBITED" }
}'Antwort
{
"document": {
"title": "GeoPilot ED-269 export",
"description": "Generated by GeoPilot's GeoJSON → ED-269 conversion endpoint.",
"features": [
{
"name": "Example zone",
"type": "CUSTOMIZED",
"restriction": "PROHIBITED",
"applicability": [],
"zoneAuthority": [],
"geometry": [
{
"uomDimensions": "M",
"horizontalProjection": {
"type": "Polygon",
"coordinates": [[[26.05,44.40],[26.15,44.40],[26.15,44.47],[26.05,44.47],[26.05,44.40]]]
}
}
]
}
]
},
"warnings": []
}Endpunkte — /convert/:from-:to
Über die beiden oben genannten ED-269⇄GeoJSON-Endpunkte hinaus wandelt POST /convert/:from-:to zwischen zwei beliebigen Formaten aus ED-269, ED-318, KML und GeoJSON um — insgesamt zwölf gerichtete Paare, unten aufgeführt mit dem jeweils erforderlichen Scope bzw. den Scopes. ed269-geojson und geojson-ed269 unter dieser kurzen URL verhalten sich identisch zu den beiden oben genannten eigenen Endpunkten und bestehen neben ihnen; beide Formen funktionieren weiterhin.
| from | to | scope(s) required |
|---|---|---|
| ed269 | ed318 | CONVERT_ED269 + CONVERT_ED318 |
| ed269 | kml | CONVERT_ED269 + CONVERT_KML |
| ed269 | geojson | CONVERT_ED269 |
| ed318 | ed269 | CONVERT_ED318 + CONVERT_ED269 |
| ed318 | kml | CONVERT_ED318 + CONVERT_KML |
| ed318 | geojson | CONVERT_ED318 |
| kml | ed269 | CONVERT_KML + CONVERT_ED269 |
| kml | ed318 | CONVERT_KML + CONVERT_ED318 |
| kml | geojson | CONVERT_KML |
| geojson | ed269 | CONVERT_ED269 |
| geojson | ed318 | CONVERT_ED318 |
| geojson | kml | CONVERT_KML |
POST /api/v1/public/convert/ed269-kml
Scope: CONVERT_ED269 + CONVERT_KML
Ein veröffentlichtes ED-269-Dokument in ein KML-Dokument umwandeln.
curl -X POST "https://geopilot.space/api/v1/public/convert/ed269-kml" \
-H "Authorization: Bearer $GEOPILOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "document": { "title": "t", "features": [ { "identifier": "ROU-001", "name": "Example zone", "restriction": "PROHIBITED", "geometry": [ { "uomDimensions": "M", "horizontalProjection": { "type": "Polygon", "coordinates": [[[26.05,44.40],[26.15,44.40],[26.15,44.47],[26.05,44.47],[26.05,44.40]]] } } ] } ] } }'Antwort
{
"document": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n <Document>\n <Placemark>\n <name>Example zone</name>\n <ExtendedData>\n <Data name=\"effect\"><value>PROHIBITED</value></Data>\n </ExtendedData>\n <Polygon>\n <altitudeMode>clampToGround</altitudeMode>\n <outerBoundaryIs><LinearRing><coordinates>26.05,44.40,0 26.15,44.40,0 26.15,44.47,0 26.05,44.47,0 26.05,44.40,0</coordinates></LinearRing></outerBoundaryIs>\n </Polygon>\n </Placemark>\n </Document>\n</kml>",
"errors": [],
"totalFeatures": 1,
"warnings": []
}POST /api/v1/public/convert/kml-ed318
Scope: CONVERT_KML + CONVERT_ED318
Ein KML-Dokument in ein ED-318-Dokument umwandeln.
curl -X POST "https://geopilot.space/api/v1/public/convert/kml-ed318" \
-H "Authorization: Bearer $GEOPILOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "document": "<kml><Document><Placemark><name>Example zone</name><ExtendedData><Data name=\"effect\"><value>PROHIBITED</value></Data></ExtendedData><Polygon><outerBoundaryIs><LinearRing><coordinates>26.05,44.40,0 26.15,44.40,0 26.15,44.47,0 26.05,44.47,0 26.05,44.40,0</coordinates></LinearRing></outerBoundaryIs></Polygon></Placemark></Document></kml>" }'Antwort
{
"document": {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": { "type": "Polygon", "coordinates": [[[26.05,44.40],[26.15,44.40],[26.15,44.47],[26.05,44.47],[26.05,44.40]]] },
"properties": {
"name": "Example zone",
"type": "CUSTOMIZED",
"restriction": "PROHIBITED",
"applicability": [],
"zoneAuthority": [],
"uomDimensions": "M"
}
}
]
},
"errors": [],
"totalFeatures": 1,
"warnings": []
}