{"openapi":"3.1.0","info":{"title":"BubbleLife API","description":"BubbleLife API. Interactive ReDoc documentation is served at `/docs`.","version":"0.1.0"},"paths":{"/health":{"get":{"tags":["health"],"summary":"Service health","operationId":"health_health_get","responses":{"200":{"description":"Service is healthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"},"example":{"status":"ok"}}}}},"x-code-samples":[{"lang":"Node.js","label":"Node.js","source":"const response = await fetch(\"https://api2.bubblelife.com/health\", { method: \"GET\" });\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst data = await response.json();\nconsole.log(data); // {\"status\":\"ok\"}"},{"lang":"Python","label":"Python","source":"import httpx\n\nresponse = httpx.get(\"https://api2.bubblelife.com/health\", timeout=10)\nresponse.raise_for_status()\nprint(response.json())  # {\"status\":\"ok\"}"},{"lang":"PHP","label":"PHP","source":"<?php\n$ch = curl_init('https://api2.bubblelife.com/health');\ncurl_setopt_array($ch, [\n    CURLOPT_RETURNTRANSFER => true,\n    CURLOPT_CUSTOMREQUEST => 'GET',\n    CURLOPT_TIMEOUT => 10,\n]);\n$body = curl_exec($ch);\nif ($body === false) {\n    throw new RuntimeException(curl_error($ch));\n}\n$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);\ncurl_close($ch);\nif ($status !== 200) {\n    throw new RuntimeException(\"HTTP $status\");\n}\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\nprint_r($data); // {\"status\":\"ok\"}"}]}},"/health/db":{"get":{"tags":["health"],"summary":"Database health","operationId":"database_health_health_db_get","responses":{"200":{"description":"Database is reachable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseHealthResponse"},"example":{"status":"ok","database":"bubblelife"}}}},"503":{"description":"Database unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"detail":"database unavailable"}}}}},"x-code-samples":[{"lang":"Node.js","label":"Node.js","source":"const response = await fetch(\"https://api2.bubblelife.com/health/db\", { method: \"GET\" });\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst data = await response.json();\nconsole.log(data); // {\"status\":\"ok\",\"database\":\"bubblelife\"}"},{"lang":"Python","label":"Python","source":"import httpx\n\nresponse = httpx.get(\"https://api2.bubblelife.com/health/db\", timeout=10)\nresponse.raise_for_status()\nprint(response.json())  # {\"status\":\"ok\",\"database\":\"bubblelife\"}"},{"lang":"PHP","label":"PHP","source":"<?php\n$ch = curl_init('https://api2.bubblelife.com/health/db');\ncurl_setopt_array($ch, [\n    CURLOPT_RETURNTRANSFER => true,\n    CURLOPT_CUSTOMREQUEST => 'GET',\n    CURLOPT_TIMEOUT => 10,\n]);\n$body = curl_exec($ch);\nif ($body === false) {\n    throw new RuntimeException(curl_error($ch));\n}\n$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);\ncurl_close($ch);\nif ($status !== 200) {\n    throw new RuntimeException(\"HTTP $status\");\n}\n$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);\nprint_r($data); // {\"status\":\"ok\",\"database\":\"bubblelife\"}"}]}}},"components":{"schemas":{"DatabaseHealthResponse":{"properties":{"status":{"type":"string","title":"Status","examples":["ok"]},"database":{"type":"string","title":"Database","examples":["bubblelife"]}},"type":"object","required":["status","database"],"title":"DatabaseHealthResponse","example":{"database":"bubblelife","status":"ok"}},"ErrorResponse":{"properties":{"detail":{"type":"string","title":"Detail","examples":["database unavailable"]}},"type":"object","required":["detail"],"title":"ErrorResponse","example":{"detail":"database unavailable"}},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status","examples":["ok"]}},"type":"object","required":["status"],"title":"HealthResponse","example":{"status":"ok"}}}}}