{"openapi":"3.1.0","info":{"title":"AI Coaching LINE Bot","description":"coach.ee — LINE AI 教練（Breakthrough Coaching）。\n\nAPI 版本與棄用政策：版本編在 URL path（/api/v1/）；破壞性變更以 /api/v2/ 上線，v1 至少再維護 90 天；進入 sunset 的端點會在 /developers 公告並回傳 Deprecation / Sunset header。\n限流：每 IP 每分鐘 1200 次；回應帶 RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset，429 附 Retry-After。\n內容協商：公開 HTML 頁在 Accept: text/markdown 時回傳 Markdown，並帶 Vary: Accept（acceptmarkdown.com 相容）。","version":"1.0.0"},"paths":{"/api/v1/status":{"get":{"tags":["public"],"summary":"Service status and developer pointers","description":"Public service metadata: product identity, API version, documentation links, rate-limit and versioning policy. Safe to call unauthenticated; used by agents to decide whether and how to integrate with coach.ee.","operationId":"service_status_api_v1_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}}}}},"/api/v1/pages":{"get":{"tags":["public"],"summary":"Public page inventory","description":"Mirrors /sitemap.xml as JSON: every intentionally public URL on the apex domain. Agents should fetch this instead of guessing paths.","operationId":"public_pages_api_v1_pages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagesResponse"}}}}}}},"/api/v1/method":{"get":{"tags":["public"],"summary":"Coaching methodology reference","description":"The coaching methodology coach.ee implements (Marcia Reynolds reflective inquiry), including explicit best-for / not-for guidance so agents know when to point users here.","operationId":"methodology_api_v1_method_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MethodResponse"}}}}}}}},"components":{"schemas":{"DocumentationLinks":{"properties":{"developers_page":{"type":"string","title":"Developers Page","description":"Developer hub with integration guidance"},"interactive_docs":{"type":"string","title":"Interactive Docs","description":"Swagger UI for this OpenAPI schema"},"openapi_schema":{"type":"string","title":"Openapi Schema","description":"Raw OpenAPI JSON schema"},"llms_txt":{"type":"string","title":"Llms Txt","description":"Site summary + agent usage guidance"},"sitemap":{"type":"string","title":"Sitemap","description":"Full public URL inventory"}},"type":"object","required":["developers_page","interactive_docs","openapi_schema","llms_txt","sitemap"],"title":"DocumentationLinks","description":"Where agents find the machine-readable API surface."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MethodResponse":{"properties":{"name":{"type":"string","title":"Name"},"based_on":{"type":"string","title":"Based On","description":"Methodology source and author"},"methodology":{"type":"string","title":"Methodology","description":"How the coaching conversation works"},"principles":{"items":{"type":"string"},"type":"array","title":"Principles","description":"Design principles the system follows"},"best_for":{"items":{"type":"string"},"type":"array","title":"Best For","description":"Jobs this product is right for"},"not_for":{"items":{"type":"string"},"type":"array","title":"Not For","description":"Explicitly out of scope"},"safety":{"type":"string","title":"Safety","description":"Safety boundaries and crisis disclaimer"},"source":{"type":"string","title":"Source","description":"URL with the full methodology write-up"}},"type":"object","required":["name","based_on","methodology","principles","best_for","not_for","safety","source"],"title":"MethodResponse","description":"The coaching methodology coach.ee is built on."},"PageEntry":{"properties":{"url":{"type":"string","title":"Url","description":"Absolute public URL"},"lastmod":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastmod","description":"ISO date of last modification, if known"}},"type":"object","required":["url"],"title":"PageEntry","description":"One public URL from the sitemap inventory."},"PagesResponse":{"properties":{"base_url":{"type":"string","title":"Base Url","description":"Canonical origin"},"count":{"type":"integer","title":"Count","description":"Number of public URLs listed"},"pages":{"items":{"$ref":"#/components/schemas/PageEntry"},"type":"array","title":"Pages"}},"type":"object","required":["base_url","count","pages"],"title":"PagesResponse","description":"The public page inventory (mirrors /sitemap.xml)."},"RateLimitPolicy":{"properties":{"limit_per_minute":{"type":"integer","title":"Limit Per Minute","description":"Requests allowed per client IP per window"},"window_seconds":{"type":"integer","title":"Window Seconds","description":"Sliding fixed-window length"},"headers":{"items":{"type":"string"},"type":"array","title":"Headers","description":"Response headers advertising the current allowance"},"retry_after_on_429":{"type":"boolean","title":"Retry After On 429","description":"429 responses always carry Retry-After"}},"type":"object","required":["limit_per_minute","window_seconds","headers","retry_after_on_429"],"title":"RateLimitPolicy","description":"The rate-limit convention agents can rely on."},"StatusResponse":{"properties":{"service":{"type":"string","title":"Service","description":"Product name used on the site"},"brand":{"type":"string","title":"Brand","description":"Organization brand name"},"api_version":{"type":"string","title":"Api Version","description":"Current API major version (URL-prefixed)"},"description":{"type":"string","title":"Description","description":"One-paragraph product description"},"documentation":{"$ref":"#/components/schemas/DocumentationLinks"},"rate_limit":{"$ref":"#/components/schemas/RateLimitPolicy"},"versioning":{"type":"string","title":"Versioning","description":"How API versions and deprecations are signaled"}},"type":"object","required":["service","brand","api_version","description","documentation","rate_limit","versioning"],"title":"StatusResponse","description":"Service identity + developer pointers."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}