Aller au contenu principal
GeoPilot

Documentation de l'API

Une documentation minimale pour l'API publique de GeoPilot — chaque point de terminaison ci-dessous est monté sur /api/v1/public sur le domaine de votre déploiement GeoPilot, authentifié par une clé API plutôt qu'un cookie de session.

Les différences entre ED-269 et ED-318, champ par champ : lisez le guide. →

API des zones interdites aux drones : premiers pas →

Convertir des géozones ED-269 et ED-318 en GeoJSON ou KML →

Lisible par machine : la description OpenAPI 3.1 →

Journal des modifications

Ce qui a changé dans l'API publique, du plus récent au plus ancien. Une modification n'est marquée Breaking que lorsqu'une requête existante, correctement formée, se comporte désormais différemment ; le reste est un ajout ou une correction.

Ajouté

Les vérifications de conflits indiquent désormais les sources écartées

Les réponses de POST /restrictions/intersect contiennent un nouveau tableau excludedSources : chaque source non licenciée pour l'API dont la forme touche aussi des restrictions, avec un nombre, mais jamais les restrictions elles-mêmes. Auparavant, une vérification dans un tel pays renvoyait total: 0, ce qui se lisait comme une zone dégagée. Chaque conflit porte aussi sourceAttribution, la mention de la source, que les données CC BY vous obligent à afficher.

Ajouté

Description OpenAPI et catalogue d’API publiés

L’API publique est désormais décrite en OpenAPI 3.1 à /api/v1/public/openapi.json, générée à partir des mêmes schémas que ceux avec lesquels l’API valide les requêtes, et répertoriée dans un catalogue RFC 9727 à /.well-known/api-catalog. Un point de disponibilité, GET /api/v1/public/health, répond sans clé. Aucune requête existante ne change de comportement.

Corrigé

Conversions ED-318 corrigées face à deux flux réels

Le codec ED-318 avait été construit à partir du schéma publié, sans flux réel pour le vérifier. Il est désormais vérifié directement face aux exports réels de Transportstyrelsen (Suède) et de l'ANAC (Portugal), et plusieurs correspondances de champs étaient erronées : l'orthographe de la valeur d'autorisation, l'emplacement de l'altitude (sur la géométrie, pas sur properties), et la façon dont la géométrie d'une zone à plusieurs volumes est représentée. Toute conversion vers ou depuis ED-318 — ed269-ed318, kml-ed318, geojson-ed318, et leurs sens inverses — peut renvoyer, pour un document ED-318 réel, un résultat différent et corrigé par rapport à avant cette correction.

Obtenir une clé

L'accès API est un produit distinct de l'abonnement carte, facturé séparément et disponible en libre-service dès que votre compte y a droit.

Nouveau ici ? S'abonner à l'accès API

Vous voulez essayer avant d'acheter, ou avez-vous besoin d'une limite de débit personnalisée ? Demander un accès

Déjà abonné ? Créez une clé depuis votre profil — nommez-la, choisissez uniquement les portées dont vous avez besoin, et copiez la clé brute lorsqu'elle s'affiche, car elle ne s'affiche qu'une seule fois. Gérer les clés API

Authentification

Chaque requête transporte votre clé comme jeton bearer.

Authorization: Bearer <your-api-key>

Deux états d'échec sont distingués :

  • Clé manquante, malformée, inconnue, révoquée ou expirée — 401 Unauthorized.
  • Une clé valide dont l'accès API du propriétaire a expiré (abonnement annulé ou expiré) — 403 Forbidden.
  • Une clé valide qui ne possède pas la portée requise par un point de terminaison — 403 Forbidden, indiquant la portée manquante.

Portées

Chaque clé est créée avec une ou plusieurs portées. Une requête nécessite la portée exigée par son point de terminaison, indépendamment du fait que le compte dispose ou non d'un accès API.

RESTRICTIONS_READ
Lire les données de restriction d'espace aérien — liste, point, rayon et recherche par restriction unique.
CONFLICT_CHECK
Vérifier une zone ou un itinéraire tracé par rapport aux restrictions actives.
CONVERT_ED269
Convertir entre ED-269 et GeoJSON.
CONVERT_KML
Convertir entre KML et tout autre format pris en charge.
CONVERT_ED318
Convertir entre ED-318 et tout autre format pris en charge.

Limites de débit

Chaque quota ci-dessous est compté par clé, sur une fenêtre glissante d'une minute. Chaque réponse inclut X-RateLimit-Limit et X-RateLimit-Remaining ; une réponse 429 inclut également Retry-After.

Conversion
/convert/ed269-to-geojson, /convert/geojson-to-ed269, /convert/:from-:to
60 requêtes par minute (par défaut).
Lectures de restrictions
/restrictions, /at, /near, /:id
60 requêtes et 200 Mo par minute (par défaut).
Vérification de conflit
/restrictions/intersect
60 requêtes par minute (par défaut).

Besoin d'une limite plus élevée pour une intégration particulière ? Demander un accès

Erreurs

Chaque échec — quel que soit le point de terminaison — a la même forme JSON (RFC 9457, « problem details »), afin que votre client puisse gérer un seul type d'erreur plutôt que de deviner pour chaque point de terminaison.

{
  "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 liste les échecs de validation au niveau des champs et n'apparaît que pour une réponse 400 ou 422.

400
Le corps de la requête, les paramètres de requête ou les paramètres de route ont échoué à la validation.
401
Clé manquante, malformée, inconnue, révoquée ou expirée.
403
Le titulaire de la clé n'a plus d'accès API actif, ou la clé n'a pas la portée requise par le point de terminaison.
404
La ressource demandée n'existe pas, ou n'est pas visible pour votre clé — voir la note sur les licences ci-dessus.
422
La géométrie soumise est invalide ou trop complexe pour être évaluée.
429
Limite de débit dépassée. Réessayez après le nombre de secondes indiqué dans Retry-After.

Pays couverts par l'API

L'API ne sert que les données des sources dont l'éditeur autorise la réutilisation commerciale et la redistribution ; elle couvre donc moins de pays que la carte. Ailleurs, les lectures de restrictions ne renvoient rien, et une vérification des conflits indique les sources écartées dans excludedSources au lieu de déclarer la zone dégagée.

Couverts:
Australie, Finlande, Luxembourg, Norvège, Suisse, États-Unis
Sur la carte uniquement (conditions de réutilisation non établies):
Lettonie, Portugal, Roumanie

Points de terminaison

Les lectures de restrictions ne renvoient que les données des sources dont la licence autorise l'usage commercial et la redistribution. Une source exclue pour cette raison se comporte comme si elle n'existait pas : GET /restrictions/:id renvoie 404 pour elle, exactement comme pour un id inconnu. La vérification des conflits est la seule exception : elle nomme ce qu'elle a écarté dans excludedSources, afin qu'un pays exclu ne soit jamais déclaré dégagé.

GET /api/v1/public/restrictions

Scope: RESTRICTIONS_READ

Lister les restrictions, filtrables par pays, boîte englobante, type, effet et plus.

curl "https://geopilot.space/api/v1/public/restrictions?country=FI" \
  -H "Authorization: Bearer $GEOPILOT_API_KEY"

Réponse

{
  "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

Toutes les restrictions des données de l'API superposées en un point.

curl "https://geopilot.space/api/v1/public/restrictions/at?lat=60.32&lon=24.95" \
  -H "Authorization: Bearer $GEOPILOT_API_KEY"

Réponse

{
  "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

Restrictions dans un rayon autour d'un point, les plus proches en premier.

curl "https://geopilot.space/api/v1/public/restrictions/near?lat=60.32&lon=24.95&radiusMeters=5000" \
  -H "Authorization: Bearer $GEOPILOT_API_KEY"

Réponse

{
  "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

Une restriction, par id.

curl "https://geopilot.space/api/v1/public/restrictions/3f1b2c4d-0000-4000-8000-000000000000" \
  -H "Authorization: Bearer $GEOPILOT_API_KEY"

Réponse

{
  "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

Vérifier un polygone ou un itinéraire par rapport aux restrictions actives et signaler ce qu'il rencontre.

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]]]
    }
  }'

Réponse

{
  "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

Convertir un document ED-269 publié en une collection d'éléments GeoJSON.

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" } } }'

Réponse

{
  "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

Convertir un élément ou une collection d'éléments GeoJSON en document ED-269.

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" }
  }'

Réponse

{
  "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": []
}

Points de terminaison — /convert/:from-:to

Au-delà des deux points de terminaison ED-269⇄GeoJSON ci-dessus, POST /convert/:from-:to convertit entre deux formats quelconques parmi ED-269, ED-318, KML et GeoJSON — douze paires dirigées au total, listées ci-dessous avec la ou les portées requises pour chacune. ed269-geojson et geojson-ed269 sous cette URL courte se comportent à l'identique des deux points de terminaison dédiés ci-dessus et coexistent avec eux ; les deux formes restent fonctionnelles.

fromtoscope(s) required
ed269ed318CONVERT_ED269 + CONVERT_ED318
ed269kmlCONVERT_ED269 + CONVERT_KML
ed269geojsonCONVERT_ED269
ed318ed269CONVERT_ED318 + CONVERT_ED269
ed318kmlCONVERT_ED318 + CONVERT_KML
ed318geojsonCONVERT_ED318
kmled269CONVERT_KML + CONVERT_ED269
kmled318CONVERT_KML + CONVERT_ED318
kmlgeojsonCONVERT_KML
geojsoned269CONVERT_ED269
geojsoned318CONVERT_ED318
geojsonkmlCONVERT_KML

POST /api/v1/public/convert/ed269-kml

Scope: CONVERT_ED269 + CONVERT_KML

Convertir un document ED-269 publié en document KML.

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]]] } } ] } ] } }'

Réponse

{
  "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

Convertir un document KML en document ED-318.

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>" }'

Réponse

{
  "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": []
}
GeoPilot

Un outil indépendant de préparation des vols de drone, fondé sur les restrictions d'espace aérien publiées par les autorités nationales, pour les pays européens couverts et les États-Unis.

Données

  • Les données d'espace aérien sont publiées par les autorités nationales de chaque pays couvert. GeoPilot n'est affilié à aucune d'entre elles ni approuvé par l'une d'elles.
  • Voir les sources et leur actualité

GeoPilot est un outil de préparation indépendant, qui n'est affilié à aucune autorité aéronautique ni approuvé par l'une d'elles. Il affiche des données publiées par les autorités nationales, qui peuvent être incomplètes, périmées ou simplifiées lors du traitement, et n'autorise aucun vol. Vérifiez toujours la publication de l'autorité et les NOTAM en vigueur avant de voler.