{"openapi":"3.1.0","info":{"title":"GridX API","version":"0.2.0-beta","description":"GridX Energy OS public API. Cloudflare Pages Functions. Session cookie auth for UI, Basic Auth for admin, HMAC signature for OpenADR VTN webhook.","contact":{"name":"Xiora / GridX","email":"xiora00000@gmail.com","url":"https://xiora-official.com/products/gridx.html"},"license":{"name":"Proprietary","url":"https://grid-x.pages.dev/terms.html"}},"servers":[{"url":"https://gridx-e5m.pages.dev","description":"Production MVP α"}],"tags":[{"name":"Auth","description":"Session + magic-link"},{"name":"Orgs","description":"Multi-tenant org management"},{"name":"Sites","description":"Physical site (contract kW + tariff)"},{"name":"Devices","description":"Battery/PV/EV/BEMS registry"},{"name":"Telemetry","description":"30-min interval kWh ingest + query"},{"name":"Forecast","description":"Demand + Solar (JMA-backed) + Anomaly"},{"name":"Diagnoses","description":"AI 電気代 診断"},{"name":"Aggregate","description":"Org-wide roll-up"},{"name":"Alerts","description":"Notification-worthy events"},{"name":"Control","description":"Command Safety Layer (Ed25519/HMAC signing + Policy Engine + Kill-switch)"},{"name":"Copilot","description":"LLM Q&A + anomaly explanation"},{"name":"Billing","description":"Stripe checkout + portal + webhook"},{"name":"OpenADR","description":"OpenADR 3.0 VTN/VEN (Phase 3)"},{"name":"Audit","description":"Hash-chained log + CSV export"},{"name":"Onboarding","description":"30-秒 quickstart"},{"name":"Federation","description":"Enterprise OS Core integration hooks"}],"paths":{"/api/health":{"get":{"tags":["Auth"],"summary":"Health check","responses":{"200":{"description":"OK"}}}},"/api/auth/magic-link":{"post":{"tags":["Auth"],"summary":"Request magic-link (DEV_MODE returns URL inline)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"]}}}},"responses":{"200":{"description":"Sent or DEV URL"}}}},"/api/auth/verify":{"get":{"tags":["Auth"],"summary":"Consume token, set session cookie, redirect /app.html","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"Redirect"}}}},"/api/auth/logout":{"post":{"tags":["Auth"],"responses":{"200":{"description":"OK"}}}},"/api/me":{"get":{"tags":["Auth"],"summary":"Current user + orgs","security":[{"session":[]}],"responses":{"200":{"description":"User info"},"401":{"description":"Unauth"}}}},"/api/portal":{"get":{"tags":["Auth"],"summary":"Dashboard bootstrap","security":[{"session":[]}],"responses":{"200":{"description":"Portal data"}}}},"/api/orgs":{"get":{"tags":["Orgs"],"security":[{"session":[]}],"responses":{"200":{"description":"List"}}},"post":{"tags":["Orgs"],"security":[{"session":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}}}}}},"responses":{"200":{"description":"Created"}}}},"/api/orgs/{id}":{"get":{"tags":["Orgs"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/orgs/switch":{"post":{"tags":["Orgs"],"summary":"Switch current tenant","responses":{"200":{"description":"OK"}}}},"/api/orgs/{id}/invite":{"post":{"tags":["Orgs"],"summary":"Invite user (admin+)","responses":{"200":{"description":"OK"}}}},"/api/orgs/{id}/members":{"get":{"tags":["Orgs"],"responses":{"200":{"description":"OK"}}}},"/api/orgs/{id}/role":{"post":{"tags":["Orgs"],"summary":"Change role (owner only)","responses":{"200":{"description":"OK"}}}},"/api/orgs/{id}/leave":{"post":{"tags":["Orgs"],"responses":{"200":{"description":"OK"}}}},"/api/sites":{"get":{"tags":["Sites"],"responses":{"200":{"description":"OK"}}},"post":{"tags":["Sites"],"summary":"Create (operator+)","responses":{"200":{"description":"OK"}}}},"/api/sites/{id}":{"get":{"tags":["Sites"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}},"post":{"tags":["Sites"]},"delete":{"tags":["Sites"],"summary":"Admin+"}},"/api/devices":{"get":{"tags":["Devices"]},"post":{"tags":["Devices"],"summary":"operator+"}},"/api/devices/adapters":{"get":{"tags":["Devices"],"summary":"Supported (Panasonic/Sharp/Kyocera/Nichicon/Omron/Tesla + ECHONET Lite/OCPP)"}},"/api/devices/{id}/command":{"post":{"tags":["Control"],"summary":"Issue command (goes through Policy Engine — currently gated by phase3_gate until Phase 3 GA)"}},"/api/telemetry/ingest":{"post":{"tags":["Telemetry"],"summary":"CSV body { site_id, csv, auto_diagnose? }"}},"/api/telemetry":{"get":{"tags":["Telemetry"],"parameters":[{"name":"site_id","in":"query"},{"name":"start","in":"query"},{"name":"end","in":"query"},{"name":"agg","in":"query","schema":{"type":"string","enum":["hour","day","month"]}}]}},"/api/telemetry/latest":{"get":{"tags":["Telemetry"],"summary":"Latest 48 slots (24h)"}},"/api/forecast/demand":{"get":{"tags":["Forecast"],"summary":"Statistical baseline (Weekday × Hour × EWMA)","parameters":[{"name":"site_id","in":"query","required":true},{"name":"horizon","in":"query","schema":{"type":"integer","default":48,"maximum":336}}]}},"/api/forecast/solar":{"get":{"tags":["Forecast"],"summary":"PV installed_kw × hour curve × JMA cloud multiplier"}},"/api/forecast/anomalies":{"get":{"tags":["Forecast"],"summary":"z-score outlier on 30-day baseline"}},"/api/diagnoses":{"get":{"tags":["Diagnoses"]},"post":{"tags":["Diagnoses"],"summary":"Run diagnosis (analyst+)"}},"/api/diagnoses/{id}":{"get":{"tags":["Diagnoses"],"summary":"JSON or ?format=html (printable white-base)"}},"/api/aggregate":{"get":{"tags":["Aggregate"],"summary":"Org-wide 30d roll-up"}},"/api/alerts":{"get":{"tags":["Alerts"],"parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["open","acknowledged","all"]}}]},"post":{"tags":["Alerts"],"summary":"analyst+"}},"/api/alerts/{id}/ack":{"post":{"tags":["Alerts"],"summary":"operator+"}},"/api/cron/scan":{"post":{"tags":["Alerts"],"summary":"Hourly anomaly scan across all orgs (header x-gridx-cron: <CRON_SECRET>)"}},"/api/copilot/ask":{"post":{"tags":["Copilot"],"summary":"LLM Q&A on telemetry + diagnoses (Pro+, rate limit 30/h)"}},"/api/copilot/explain-anomaly":{"post":{"tags":["Copilot"],"summary":"Explain a specific anomaly with contextual features (Pro+)"}},"/api/billing/status":{"get":{"tags":["Billing"]}},"/api/billing/checkout":{"post":{"tags":["Billing"],"summary":"Stripe checkout (owner only)"}},"/api/billing/portal":{"post":{"tags":["Billing"],"summary":"Stripe billing portal (owner only)"}},"/api/billing/webhook":{"post":{"tags":["Billing"],"summary":"Stripe → GridX (signature verified via STRIPE_WEBHOOK_SECRET)"}},"/api/openadr/programs":{"get":{"tags":["OpenADR"]},"post":{"tags":["OpenADR"],"summary":"Subscribe program (Enterprise, admin+)"}},"/api/openadr/events":{"get":{"tags":["OpenADR"]}},"/api/openadr/events/inbound":{"post":{"tags":["OpenADR"],"summary":"VTN → VEN webhook (HMAC signature)"}},"/api/openadr/events/{id}/report":{"post":{"tags":["OpenADR"],"summary":"VEN reports committed vs delivered"}},"/api/audit/export":{"get":{"tags":["Audit"],"summary":"CSV export of hash-chained audit log (Pro+, auditor role)"}},"/api/onboarding/quickstart":{"post":{"tags":["Onboarding"],"summary":"30-秒 onboarding: org + site + PV + battery + sample telemetry + first diagnosis"}},"/api/auth/sso/init":{"get":{"tags":["Auth"],"summary":"SSO init (Enterprise only, Phase 2 stub)"}},"/api/openapi.json":{"get":{"summary":"This spec"}}},"components":{"securitySchemes":{"session":{"type":"apiKey","in":"cookie","name":"gridx_s"},"basicAdmin":{"type":"http","scheme":"basic"},"cronSecret":{"type":"apiKey","in":"header","name":"x-gridx-cron"},"moduleKey":{"type":"apiKey","in":"header","name":"x-xiora-signing-key"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}},"Ok":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}}