{"openapi":"3.0.3","info":{"title":"C3 Services — Unified Service API Gateway","version":"1.0.0","description":"Unified gateway to all self-hosted service APIs. Proxies OpenAPI services and wraps custom REST/protocol services."},"components":{"schemas":{}},"paths":{"/":{"get":{"summary":"List all services with API status","tags":["Registry"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"services":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"displayName":{"type":"string"},"description":{"type":"string"},"vm":{"type":"string"},"apiType":{"type":"string"},"endpointCount":{"type":"number"},"hasSpec":{"type":"boolean"}}}},"total":{"type":"number"}}}}}}}}},"/{service}":{"get":{"summary":"Get service detail","tags":["Registry"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"service","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/{service}/spec":{"get":{"summary":"Get OpenAPI spec for a service","tags":["Registry"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"service","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/{service}/proxy":{"post":{"summary":"Proxy request to an OpenAPI service","tags":["Proxy"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE"]},"path":{"type":"string","description":"API path (e.g. /api/v1/users)"},"body":{"description":"Request body (for POST/PUT/PATCH)"},"headers":{"type":"object","additionalProperties":{"type":"string"},"description":"Extra headers"}},"required":["method","path"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"service","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/matomo/visits":{"get":{"summary":"Get visit summary","tags":["Matomo"],"parameters":[{"schema":{"type":"string","default":"1"},"in":"query","name":"idSite","required":false},{"schema":{"type":"string","default":"day"},"in":"query","name":"period","required":false},{"schema":{"type":"string","default":"today"},"in":"query","name":"date","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/matomo/sites":{"get":{"summary":"List all tracked sites","tags":["Matomo"],"responses":{"200":{"description":"Default Response"}}}},"/matomo/actions":{"get":{"summary":"Get page view and action stats","tags":["Matomo"],"parameters":[{"schema":{"type":"string","default":"1"},"in":"query","name":"idSite","required":false},{"schema":{"type":"string","default":"day"},"in":"query","name":"period","required":false},{"schema":{"type":"string","default":"today"},"in":"query","name":"date","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/matomo/referrers":{"get":{"summary":"Get referrer stats","tags":["Matomo"],"parameters":[{"schema":{"type":"string","default":"1"},"in":"query","name":"idSite","required":false},{"schema":{"type":"string","default":"day"},"in":"query","name":"period","required":false},{"schema":{"type":"string","default":"today"},"in":"query","name":"date","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/matomo/live":{"get":{"summary":"Get last visits (live)","tags":["Matomo"],"parameters":[{"schema":{"type":"string","default":"1"},"in":"query","name":"idSite","required":false},{"schema":{"type":"string","default":"day"},"in":"query","name":"period","required":false},{"schema":{"type":"string","default":"today"},"in":"query","name":"date","required":false},{"schema":{"type":"string"},"in":"query","name":"segment","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/syncthing/status":{"get":{"summary":"Get system status","tags":["Syncthing"],"responses":{"200":{"description":"Default Response"}}}},"/syncthing/config":{"get":{"summary":"Get current configuration","tags":["Syncthing"],"responses":{"200":{"description":"Default Response"}}}},"/syncthing/folders":{"get":{"summary":"List all synced folders with status","tags":["Syncthing"],"responses":{"200":{"description":"Default Response"}}}},"/syncthing/devices":{"get":{"summary":"List connected devices","tags":["Syncthing"],"responses":{"200":{"description":"Default Response"}}}},"/mailu/domains":{"get":{"summary":"List all mail domains","tags":["Mailu"],"responses":{"200":{"description":"Default Response"}}}},"/mailu/users":{"get":{"summary":"List all mail users","tags":["Mailu"],"responses":{"200":{"description":"Default Response"}}}},"/mailu/aliases":{"get":{"summary":"List all mail aliases","tags":["Mailu"],"responses":{"200":{"description":"Default Response"}}}},"/ntfy/health":{"get":{"summary":"Check ntfy server health","tags":["ntfy"],"responses":{"200":{"description":"Default Response"}}}},"/ntfy/publish":{"post":{"summary":"Publish a notification","tags":["ntfy"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string"},"message":{"type":"string"},"title":{"type":"string"},"priority":{"type":"number","minimum":1,"maximum":5},"tags":{"type":"array","items":{"type":"string"}}},"required":["topic","message"]}}}},"responses":{"200":{"description":"Default Response"}}}},"/ollama/models":{"get":{"summary":"List available models","tags":["Ollama"],"responses":{"200":{"description":"Default Response"}}}},"/ollama/generate":{"post":{"summary":"Generate text completion","tags":["Ollama"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"model":{"type":"string"},"prompt":{"type":"string"},"stream":{"type":"boolean","default":false}},"required":["model","prompt"]}}}},"responses":{"200":{"description":"Default Response"}}}},"/ollama/chat":{"post":{"summary":"Chat completion","tags":["Ollama"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"model":{"type":"string"},"messages":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string"},"content":{"type":"string"}},"required":["role","content"]}}},"required":["model","messages"]}}}},"responses":{"200":{"description":"Default Response"}}}},"/radicale/calendars":{"get":{"summary":"List calendars","tags":["Radicale"],"responses":{"200":{"description":"Default Response"}}}},"/radicale/contacts":{"get":{"summary":"List contact collections","tags":["Radicale"],"responses":{"200":{"description":"Default Response"}}}},"/radicale/events/{collection}":{"get":{"summary":"Get events from a calendar collection","tags":["Radicale"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"collection","required":true}],"responses":{"200":{"description":"Default Response"}}}}},"tags":[{"name":"Registry","description":"Service catalog and API discovery"},{"name":"Proxy","description":"Generic proxy for OpenAPI-compatible services"},{"name":"Matomo","description":"Web analytics (Matomo)"},{"name":"Syncthing","description":"File synchronization (Syncthing)"},{"name":"Mailu","description":"Email server administration (Mailu)"},{"name":"ntfy","description":"Push notifications (ntfy)"},{"name":"Ollama","description":"LLM inference (Ollama)"},{"name":"Radicale","description":"Calendar and contacts (Radicale CalDAV)"}]}