{"name":"API Gateway (Fastify)","version":"1.0.0","performance":"High-performance with Fastify","endpoints":{"measures":{"/measures/bbox":"GET - Measures by bounding box","/measures/clusters":"GET - Measures clustering","/measures/:id":"GET - Measure details","/measures/openapi.json":"GET - Measures OpenAPI documentation"},"cartography":{"/cartography":"GET - Cartography visible for user","/cartography/stats/{tileset_id}":"GET - Cartography statistics","/cartography/openapi.json":"GET - Cartography OpenAPI documentation"},"emetteur":{"/emetteur/bbox":"GET - Supports with stations in bounding box","/emetteur/radius":"GET - Supports with stations in radius","/emetteur/polygon":"POST - Supports with stations within a buffered geometry","/emetteur/polygon/bilan":"POST - Aggregated radio summary of a geometry","/emetteur/:id":"GET - Support details with all stations, antennas and emitters","/emetteur/openapi.json":"GET - Emetteur OpenAPI documentation"},"label":{"/label/dashboard":"GET - Yearly indicators for the whole client","/label/establishments":"GET - Special establishments counted over a period","/label/openapi.json":"GET - Label OpenAPI documentation"},"supervision":{"/supervision/sites/bbox":"GET - Sites by bounding box for user","/supervision/sites/:id/measures":"GET - Measures for a site","/supervision/sites/:id/measures/csv":"GET - Measures in CSV format","/supervision/odo/sites":"GET - Sites published on the Observatoire des ondes (open, no auth)","/supervision/odo/sites/:id":"GET - Public data of a published site (open, no auth)","/supervision/openapi.json":"GET - Supervision OpenAPI documentation"},"dim":{"/dim":"GET/POST - List or create DIM records","/dim/:id":"GET - DIM details","/dim/:id/ep":"GET - EPs linked to DIM","/dim/:id/instruction":"GET/POST/PUT - DIM instruction management","/dim/bat/radius":"GET - Buildings by radius","/dim/bat/polygon":"GET - Buildings by polygon","/dim/bat/:id":"GET - Building details","/dim/bat/:id/candidat":"POST - Register building as candidate","/dim/bat/:id/ep":"POST - Designate building as EP","/dim/ep/radius":"GET - EPs by radius","/dim/ep/polygon":"GET - EPs by polygon","/dim/ep/dim/:id":"GET - EPs near DIM","/dim/ep/:id":"GET/DELETE - EP details or delete","/dim/ep/:id/geog":"PUT - Update EP geographic zone","/dim/site/bbox":"GET - Sites by bounding box","/dim/site/:id":"GET - Site details","/dim/site/station/:id":"POST - Modify antenna position","/dim/openapi.json":"GET - Dim OpenAPI documentation"},"auth":{"/auth/login":"POST - Authenticate and get tokens","/auth/refresh":"POST - Rotate the refresh token","/auth/logout":"POST - Revoke a refresh token","/auth/me":"GET/PUT - Current user profile","/auth/me/password":"PUT - Change own password","/auth/password/forgot":"POST - Request a reset link","/auth/password/reset":"POST - Consume a reset token","/auth/users":"GET/POST - Account management","/auth/users/:id":"GET/PUT/DELETE - Account details","/auth/roles":"GET - Available roles","/auth/permissions":"GET - Permission catalogue","/auth/openapi.json":"GET - Auth OpenAPI documentation"}},"auth":{"required":"x-api-key header required on every call, plus Authorization: Bearer <jwt> except on public endpoints","mechanism":"API key + JWT issued by api-auth","publicEndpoints":["/auth/login","/auth/refresh","/auth/password/forgot","/auth/password/reset","/auth/openapi.json","/auth/health"],"openEndpoints":"GET /supervision/odo/sites and /supervision/odo/sites/:id need neither x-api-key nor JWT (public data of the Observatoire des ondes)","flow":"The gateway verifies the JWT signature (no database access) and forwards the identity to downstream APIs via the x-user-id, x-client-id and x-permissions headers."}}