{"openapi":"3.0.0","paths":{"/":{"get":{"operationId":"AppController_getHello","parameters":[],"responses":{"200":{"description":""}},"summary":"Service landing page","tags":["Service"]}},"/edge-sessions":{"post":{"description":"identityId/subject/issuer in the body are ignored. AuthLink on identity-api is the source of IdentityId.","operationId":"EdgeSessionController_create","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEdgeSessionDto"}}}},"responses":{"201":{"description":"EdgeSession created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EdgeSessionResponseDto"}}}},"400":{"description":"Invalid input data"}},"security":[{"bearer":[]}],"summary":"Open an edge session from a ZITADEL user token","tags":["EdgeSessions"]},"get":{"operationId":"EdgeSessionController_findAll","parameters":[],"responses":{"403":{"description":"Unscoped edge session list is not a client API"}},"security":[{"bearer":[]}],"summary":"Client apps must use GET /sessions/me","tags":["EdgeSessions"]}},"/edge-sessions/{id}":{"get":{"operationId":"EdgeSessionController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"EdgeSession ID","schema":{"format":"uuid","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"EdgeSession found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EdgeSessionResponseDto"}}}},"404":{"description":"EdgeSession not found"}},"security":[{"bearer":[]}],"summary":"Get the caller's edgeSession by ID","tags":["EdgeSessions"]},"put":{"operationId":"EdgeSessionController_update","parameters":[{"name":"id","required":true,"in":"path","description":"EdgeSession ID","schema":{"format":"uuid","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEdgeSessionDto"}}}},"responses":{"200":{"description":"EdgeSession updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EdgeSessionResponseDto"}}}},"404":{"description":"EdgeSession not found"}},"security":[{"bearer":[]}],"summary":"Update the caller's edgeSession persona only","tags":["EdgeSessions"]},"delete":{"operationId":"EdgeSessionController_delete","parameters":[{"name":"id","required":true,"in":"path","description":"EdgeSession ID","schema":{"format":"uuid","type":"string"}},{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"204":{"description":"EdgeSession deleted successfully"},"404":{"description":"EdgeSession not found"}},"security":[{"bearer":[]}],"summary":"Delete the caller's edgeSession","tags":["EdgeSessions"]}},"/sessions/me":{"get":{"operationId":"SessionController_me","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}},{"name":"persona","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EdgeSessionResponseDto"}}}},"401":{"description":"Missing issuer, missing token, or rejected JWT"},"403":{"description":"Machine token or sub used as a clinical key"}},"security":[{"bearer":[]}],"summary":"Validate the ZITADEL JWT, resolve IdentityId via identity-api AuthLink, persist EdgeSession","tags":["Sessions"]}},"/domain-hops":{"post":{"operationId":"DomainHopController_create","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDomainHopDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainHopResponseDto"}}}},"401":{"description":"Missing issuer or rejected JWT"}},"security":[{"bearer":[]}],"summary":"Hop to a domain API with x-internal-api-key and x-identity-id. Clients never receive the internal key.","tags":["DomainHops"]}},"/health":{"get":{"operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":"The Health Check is successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}},"503":{"description":"The Health Check is not successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"error"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"},"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}}},"summary":"Basic health check","tags":["Health"]}},"/health/ready":{"get":{"operationId":"HealthController_readiness","parameters":[],"responses":{"200":{"description":"The Health Check is successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}},"503":{"description":"The Health Check is not successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"error"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"},"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}}},"summary":"Readiness check - is the service ready to receive traffic?","tags":["Health"]}},"/health/live":{"get":{"operationId":"HealthController_liveness","parameters":[],"responses":{"200":{"description":"The Health Check is successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}},"503":{"description":"The Health Check is not successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"error"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"},"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}}},"summary":"Liveness check - is the service alive?","tags":["Health"]}}},"info":{"title":"Edge API","description":"Client edge: ZITADEL JWT, AuthLink to IdentityId, S2S hop to domain APIs. Browsers never receive INTERNAL_API_KEY. Issuer is https://auth.stormbyva.com.","version":"1.0","contact":{}},"tags":[],"servers":[{"url":"https://edge.stormbyva.com"}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{"CreateEdgeSessionDto":{"type":"object","properties":{"subject":{"type":"string","description":"Ignored. ZITADEL sub is never a clinical key."},"issuer":{"type":"string","description":"Ignored. Issuer comes from configured ZITADEL_ISSUER."},"identityId":{"type":"string","description":"Ignored. IdentityId is resolved from identity-api AuthLink."},"persona":{"type":"string","description":"Client persona for this edge session","example":"patient"}},"required":["persona"]},"EdgeSessionResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier","format":"uuid"},"subject":{"type":"string","description":"The subject of the entity","example":"Sample text"},"issuer":{"type":"string","description":"The issuer of the entity","example":"Sample text"},"identityId":{"type":"string","description":"The identity id of the entity","example":"550e8400-e29b-41d4-a716-446655440000"},"persona":{"type":"string","description":"The persona of the entity"},"isActive":{"type":"boolean","description":"Whether the record is active"},"createdAt":{"format":"date-time","type":"string","description":"Creation timestamp"},"updatedAt":{"format":"date-time","type":"string","description":"Last update timestamp"}},"required":["id","subject","issuer","identityId","persona","isActive","createdAt","updatedAt"]},"UpdateEdgeSessionDto":{"type":"object","properties":{"subject":{"type":"string","description":"Ignored. ZITADEL sub is never a clinical key."},"issuer":{"type":"string","description":"Ignored. Issuer comes from configured ZITADEL_ISSUER."},"identityId":{"type":"string","description":"Ignored. IdentityId is resolved from identity-api AuthLink."},"persona":{"type":"string","description":"Client persona for this edge session","example":"patient"},"isActive":{"type":"boolean","description":"Whether the record is active"}}},"CreateDomainHopDto":{"type":"object","properties":{"target":{"type":"string","description":"The target of the entity","example":"Sample text"},"path":{"type":"string","description":"The path of the entity","example":"Sample text"},"method":{"type":"string","description":"The method of the entity","example":"Sample text"},"body":{"type":"object","description":"The body of the entity"}},"required":["target","path","method"]},"DomainHopResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier","format":"uuid"},"status":{"type":"number","description":"Upstream HTTP status"},"body":{"type":"object","description":"Upstream JSON or text body. Never includes INTERNAL_API_KEY."},"isActive":{"type":"boolean","description":"Whether the record is active"},"createdAt":{"format":"date-time","type":"string","description":"Creation timestamp"},"updatedAt":{"format":"date-time","type":"string","description":"Last update timestamp"}},"required":["id","status","body","isActive","createdAt","updatedAt"]}}}}