{"name": "GridView Reporting API", "version": "1.0.0", "default_timezone": "Africa/Johannesburg", "ui_url": "http://gridview.reverse-proxy.co.za/", "docs_url": "http://gridview.reverse-proxy.co.za/docs", "openapi_url": "http://gridview.reverse-proxy.co.za/openapi.json", "frontend_version_url": "http://gridview.reverse-proxy.co.za/frontend-version", "auth": {"required_for_json_endpoints": true, "header_api_keys_enabled": true, "admin_api_key_enabled": true, "browser_read_cookie_enabled": true, "service_api_keys": [{"name": "report-reader", "scopes": ["read"]}, {"name": "tariff-admin", "scopes": ["read", "tariff_admin_write"]}], "open_paths": ["/", "/api-info", "/docs", "/favicon.png", "/frontend-version", "/health", "/health/streams", "/openapi.json"], "accepted_methods": [{"header": "X-API-Key", "format": "admin API key or scoped service API key"}, {"header": "Authorization", "format": "Bearer <admin-or-service-key>"}, {"cookie": "gridview_reporting_ui", "format": "auto-set browser cookie for read-only dashboard routes"}]}, "examples": {"meter": "meter-subtropico-fridge", "stream_health_url": "http://gridview.reverse-proxy.co.za/health/streams", "tariff_admin_url": "http://gridview.reverse-proxy.co.za/tariff-admin?meter=meter-subtropico-fridge", "hourly_usage_url": "http://gridview.reverse-proxy.co.za/usage/hourly?meter=meter-subtropico-fridge&start=2026-03-01T00:00:00%2B02:00&end=2026-04-01T00:00:00%2B02:00", "billing_summary_url": "http://gridview.reverse-proxy.co.za/billing/summary?meter=meter-subtropico-fridge&start=2026-03-01T00:00:00%2B02:00&end=2026-04-01T00:00:00%2B02:00", "billing_invoice_pdf_url": "http://gridview.reverse-proxy.co.za/billing/invoice.pdf?meter=meter-subtropico-fridge&start=2026-03-01T00:00:00%2B02:00&end=2026-04-01T00:00:00%2B02:00"}, "endpoints": [{"path": "/favicon.png", "auth_required": false, "purpose": "GridView favicon using the same curated source asset as GridBrain"}, {"path": "/health", "auth_required": false, "purpose": "service health and basic runtime metadata"}, {"path": "/openapi.json", "auth_required": false, "purpose": "machine-readable API contract for agents and clients"}, {"path": "/api-info", "auth_required": false, "purpose": "compact discovery summary with auth and example URLs"}, {"path": "/frontend-version", "auth_required": false, "purpose": "no-store frontend build metadata for update-aware clients"}, {"path": "/health/streams", "auth_required": false, "purpose": "stream freshness for source replication and rollup updates"}, {"path": "/meters", "auth_required": true, "service_scope": "read", "purpose": "list meters that currently have reporting rows"}, {"path": "/usage/coverage", "auth_required": true, "service_scope": "read", "purpose": "reporting coverage window per meter from the local rollup store"}, {"path": "/tariff-admin", "auth_required": true, "service_scope": "read", "purpose": "fetch tariff catalog, plan assignments, charge config, and holiday overrides"}, {"path": "/tariff-admin/meter-state", "auth_required": true, "service_scope": "tariff_admin_write", "purpose": "update meter availability and use for the reporting UI"}, {"path": "/tariff-admin/assignment", "auth_required": true, "service_scope": "tariff_admin_write", "purpose": "create or update a meter tariff assignment"}, {"path": "/tariff-admin/charge-config", "auth_required": true, "service_scope": "tariff_admin_write", "purpose": "create or update a meter fixed-charge configuration"}, {"path": "/tariff-admin/holiday-override", "auth_required": true, "service_scope": "tariff_admin_write", "purpose": "create or update a plan-specific holiday day-type override"}, {"path": "/usage/hourly", "auth_required": true, "service_scope": "read", "purpose": "fetch hourly usage rows and summary totals for a meter and range"}, {"path": "/billing/summary", "auth_required": true, "service_scope": "read", "purpose": "fetch billing summary totals for a meter and range"}, {"path": "/billing/invoice.pdf", "auth_required": true, "service_scope": "read", "purpose": "render a printable invoice PDF for a meter and range"}]}