{
  "upstreams": {
    "api": {
      "name": "Weather Data Hub",
      "env": "WEATHER_DATA_HUB_URL",
      "base_url": "https://hub.weather.giscloud.ru"
    },
    "map": {
      "name": "Martin Tiles",
      "env": "MARTIN_TILES_URL",
      "base_url": "https://tiles.weather.giscloud.ru"
    }
  },
  "tabs": {
    "api": [
      {
        "title": "Service and Docs",
        "endpoints": [
          {
            "method": "GET",
            "path": "/healthcheck",
            "summary": "Service health check"
          },
          {
            "method": "GET",
            "path": "/api/openapi.json",
            "summary": "OpenAPI JSON document"
          },
          {
            "method": "GET",
            "path": "/api/docs",
            "summary": "Swagger UI documentation"
          },
          {
            "method": "GET",
            "path": "/api/foo",
            "summary": "Basic service status endpoint"
          },
          {
            "method": "POST",
            "path": "/api/create",
            "summary": "Create placeholder resource"
          }
        ]
      },
      {
        "title": "Meteo Data",
        "endpoints": [
          {
            "method": "GET",
            "path": "/api/meteoData/getSigwxUpdateDate",
            "summary": "SIGWX update timestamp by source"
          },
          {
            "method": "GET",
            "path": "/api/meteoData/getAerodromWeather",
            "summary": "Aerodrome weather by airport index"
          },
          {
            "method": "GET",
            "path": "/api/Meteo/getTafByAirportAndDate",
            "summary": "TAF list by airport and date"
          },
          {
            "method": "POST",
            "path": "/api/Meteo/getTafByAirportsAndDate",
            "summary": "TAF list by airports and date"
          },
          {
            "method": "POST",
            "path": "/api/Meteo/getTafMapByAirportsAndDate",
            "summary": "Latest TAF map by airports and date"
          },
          {
            "method": "GET",
            "path": "/api/Meteo/getMetarTafText",
            "summary": "METAR/SPECI/TAF raw texts after dateTime"
          },
          {
            "method": "GET",
            "path": "/api/Meteo/getExternalMeteo",
            "summary": "METAR/SPECI GeoJSON by bbox or airport id"
          },
          {
            "method": "POST",
            "path": "/api/Meteo/getExternalMeteo",
            "summary": "METAR/SPECI GeoJSON by bbox or airport id"
          },
          {
            "method": "GET",
            "path": "/api/Meteo/getWeatherBoard",
            "summary": "Airport weather board"
          },
          {
            "method": "GET",
            "path": "/api/Meteo/militaryMeteoAer",
            "summary": "Legacy military weather board wrapper"
          },
          {
            "method": "POST",
            "path": "/api/Meteo/militaryMeteoAer",
            "summary": "Legacy military weather board wrapper"
          },
          {
            "method": "POST",
            "path": "/api/Meteo/getMetarTafByAirpotsList",
            "summary": "METAR and TAF raw text by airport list"
          },
          {
            "method": "GET",
            "path": "/api/Meteo/internal/getSigmets",
            "summary": "Active SIGMET zones"
          },
          {
            "method": "GET",
            "path": "/api/Meteo/internal/getAirmets",
            "summary": "Active AIRMET zones"
          },
          {
            "method": "GET",
            "path": "/api/Meteo/internal/getGamets",
            "summary": "Active GAMET zones"
          },
          {
            "method": "GET",
            "path": "/api/meteoData/getSigmet",
            "summary": "SIGMET by id"
          },
          {
            "method": "GET",
            "path": "/api/meteoData/getAirmet",
            "summary": "AIRMET by id"
          },
          {
            "method": "GET",
            "path": "/api/meteoData/getGamet",
            "summary": "GAMET by id"
          },
          {
            "method": "GET",
            "path": "/api/meteoData/getVa",
            "summary": "Volcanic ash advisory by id"
          },
          {
            "method": "GET",
            "path": "/api/meteoData/getTc",
            "summary": "Tropical cyclone advisory by id"
          },
          {
            "method": "POST",
            "path": "/api/meteoData/getSigmetGeometry",
            "summary": "Active SIGMET geometry list"
          },
          {
            "method": "POST",
            "path": "/api/meteoData/getSigmetList",
            "summary": "Active SIGMET list"
          },
          {
            "method": "POST",
            "path": "/api/meteoData/getAirmetGeometry",
            "summary": "Active AIRMET geometry list"
          },
          {
            "method": "POST",
            "path": "/api/meteoData/getGametGeometry",
            "summary": "Active GAMET geometry list"
          },
          {
            "method": "GET",
            "path": "/api/meteoData/getTcAdvisoryList",
            "summary": "Active tropical cyclone advisory list"
          }
        ]
      },
      {
        "title": "Bulletins",
        "endpoints": [
          {
            "method": "POST",
            "path": "/api/bulletins/point",
            "summary": "Create meteorological bulletin for a point or aerodrome"
          },
          {
            "method": "POST",
            "path": "/api/bulletins/route",
            "summary": "Create meteorological bulletin for a route"
          },
          {
            "method": "GET",
            "path": "/api/bulletins/nearest-aerodrome",
            "summary": "Resolve nearest aerodrome for point coordinates"
          },
          {
            "method": "GET",
            "path": "/api/bulletins/{id}",
            "summary": "Get stored meteorological bulletin by id"
          },
          {
            "method": "GET",
            "path": "/api/bulletins/{id}.html",
            "summary": "Get stored meteorological bulletin as HTML"
          },
          {
            "method": "GET",
            "path": "/api/bulletins/{id}.pdf",
            "summary": "Get stored meteorological bulletin as PDF"
          },
          {
            "method": "GET",
            "path": "/api/bulletins/{id}.md",
            "summary": "Get stored meteorological bulletin as Markdown"
          }
        ]
      },
      {
        "title": "GRIB",
        "endpoints": [
          {
            "method": "POST",
            "path": "/api/grib/getGribInfo",
            "summary": "GRIB metadata"
          },
          {
            "method": "POST",
            "path": "/api/Meteo/getGribInfo",
            "summary": "Legacy alias for GRIB metadata"
          },
          {
            "method": "GET",
            "path": "/api/grib/getGribLayersInfo",
            "summary": "GRIB layers metadata"
          },
          {
            "method": "GET",
            "path": "/api/grib/getGribLayersData",
            "summary": "GRIB layers as binary payload"
          },
          {
            "method": "GET",
            "path": "/api/grib/getGribLayersDataJson",
            "summary": "GRIB layers as JSON payload"
          },
          {
            "method": "POST",
            "path": "/api/grib/getSimpleRouteMeteoByGrib",
            "summary": "Meteo for route points"
          },
          {
            "method": "POST",
            "path": "/api/grib/getMfpGrib",
            "summary": "MFP GRIB data"
          },
          {
            "method": "POST",
            "path": "/api/grib/getGribForPoints",
            "summary": "GRIB forecast by points"
          },
          {
            "method": "POST",
            "path": "/api/grib/getSppiMeteoPoint",
            "summary": "SPPI meteo for point"
          },
          {
            "method": "POST",
            "path": "/api/grib/getSppiMeteoPoints",
            "summary": "SPPI meteo for points"
          },
          {
            "method": "POST",
            "path": "/api/grib/getMeteoByBbox",
            "summary": "Meteo by bounding box"
          },
          {
            "method": "POST",
            "path": "/api/grib/getMeteoByTypeInPoint",
            "summary": "Meteo by type in point"
          },
          {
            "method": "POST",
            "path": "/api/grib/wfs/wfs_keys_pb",
            "summary": "WFS keys protobuf payload"
          },
          {
            "method": "POST",
            "path": "/api/grib/wfs/wfs_grid_wind_pb",
            "summary": "WFS wind grid protobuf payload"
          },
          {
            "method": "POST",
            "path": "/api/grib/tms/getTileImage",
            "summary": "Get tile image"
          },
          {
            "method": "POST",
            "path": "/api/grib/tms/renderTileImage",
            "summary": "Render tile image"
          },
          {
            "method": "GET",
            "path": "/api/grib/tms/{type}/{forecast}/{height}/{z}/{x}/{y}.webp",
            "summary": "Get tile image by path params"
          },
          {
            "method": "GET",
            "path": "/api/grib/tms/reload",
            "summary": "Reload tile cache"
          },
          {
            "method": "GET",
            "path": "/api/grib/tms/testMem",
            "summary": "Warmup tile cache"
          },
          {
            "method": "GET",
            "path": "/api/grib/internal/reloadData",
            "summary": "Trigger GRIB data reload"
          }
        ]
      },
      {
        "title": "Operations and Legacy Capture",
        "endpoints": [
          {
            "method": "GET",
            "path": "/api/db-indexes/status",
            "summary": "Database index status"
          },
          {
            "method": "POST",
            "path": "/api/db-indexes/recheck",
            "summary": "Recheck database indexes"
          },
          {
            "method": "GET",
            "path": "/api/old-requests/catalog",
            "summary": "Captured request catalog"
          },
          {
            "method": "GET",
            "path": "/api/old-requests/entries/{id}",
            "summary": "Captured request details"
          },
          {
            "method": "GET",
            "path": "/api/old-requests/entries/{id}/body",
            "summary": "Captured request body"
          },
          {
            "method": "DELETE",
            "path": "/api/old-requests/entries/{id}",
            "summary": "Delete captured request"
          },
          {
            "method": "POST",
            "path": "/api/old-requests/entries/{id}/check",
            "summary": "Mark captured request as checked"
          },
          {
            "method": "POST",
            "path": "/api/old-requests/delete-errors",
            "summary": "Delete non-success captured requests"
          },
          {
            "method": "POST",
            "path": "/api/old-requests/groups/check",
            "summary": "Mark captured request group as checked"
          },
          {
            "method": "POST",
            "path": "/api/old-requests/compare",
            "summary": "Replay and compare captured request"
          },
          {
            "method": "POST",
            "path": "/api/old-requests/reports",
            "summary": "Create captured request report"
          }
        ]
      }
    ],
    "map": [
      {
        "title": "Styles and Assets",
        "endpoints": [
          {
            "method": "GET",
            "path": "/styles",
            "summary": "Available Martin style list"
          },
          {
            "method": "GET",
            "path": "/styles/{style_path}",
            "summary": "MapLibre style JSON with MARTIN_HOST interpolation"
          },
          {
            "method": "GET",
            "path": "/sprite/{sprite_file}",
            "summary": "Map sprite JSON or PNG assets"
          },
          {
            "method": "GET",
            "path": "/fonts/{fontstack}/{range}.pbf",
            "summary": "Map font glyph range"
          },
          {
            "method": "GET",
            "path": "/fonts.json",
            "summary": "Available font list"
          }
        ]
      },
      {
        "title": "Sources and Metadata",
        "endpoints": [
          {
            "method": "GET",
            "path": "/sources/{source}",
            "summary": "TileJSON and source metadata"
          },
          {
            "method": "GET",
            "path": "/sources/{source}/dem",
            "summary": "RGB DEM PNG for client-side contours"
          },
          {
            "method": "GET",
            "path": "/sources/{source}/ows",
            "summary": "GeoJSON OWS-style source query"
          },
          {
            "method": "GET",
            "path": "/api/weather/point",
            "summary": "Weather values for point coordinates"
          },
          {
            "method": "GET",
            "path": "/pointinfo",
            "summary": "Point feature/weather information"
          },
          {
            "method": "GET",
            "path": "/get_info/{feature_id}",
            "summary": "NOTAM feature details"
          }
        ]
      },
      {
        "title": "Tiles and Images",
        "endpoints": [
          {
            "method": "GET",
            "path": "/rb_tiles/{source}/{z}/{x}/{y}",
            "summary": "Vector tile, raster tile, image tile, or DEM tile by source"
          },
          {
            "method": "GET",
            "path": "/rb_tiles/{source}",
            "summary": "Single image weather raster source"
          },
          {
            "method": "GET",
            "path": "/dem/tiles.json",
            "summary": "Demo raster-dem TileJSON"
          },
          {
            "method": "GET",
            "path": "/dem/tiles/{z}/{x}/{y}.png",
            "summary": "Demo raster-dem tile image"
          }
        ]
      },
      {
        "title": "Spatial Queries",
        "endpoints": [
          {
            "method": "GET",
            "path": "/rb_within/{source}",
            "summary": "Features within radius of lat/lon"
          },
          {
            "method": "POST",
            "path": "/rb_intersects/{source}",
            "summary": "Features intersecting WKT geometry"
          }
        ]
      },
      {
        "title": "Map Debug Pages",
        "endpoints": [
          {
            "method": "GET",
            "path": "/map",
            "summary": "Martin debug MapLibre page"
          },
          {
            "method": "GET",
            "path": "/map6",
            "summary": "MapLibre preview page for selected style URL"
          }
        ]
      }
    ]
  }
}