{
  "openapi": "3.0.3",
  "info": {
    "title": "FHIR Chat Zulip Search API",
    "version": "1.0.0",
    "description": "Search and browse indexed Zulip messages from the FHIR Chat community."
  },
  "servers": [
    {
      "url": "https://fhirchat.apki.dev",
      "description": "Production"
    },
    {
      "url": "http://localhost:4477",
      "description": "Local"
    }
  ],
  "paths": {
    "/health": {
      "get": {
        "summary": "Health check",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/stats": {
      "get": {
        "summary": "Index statistics",
        "responses": {
          "200": {
            "description": "Stats object"
          }
        }
      }
    },
    "/search": {
      "get": {
        "summary": "Search topics (BM25) — text/plain",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Search query"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20,
              "minimum": 1,
              "maximum": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Search results as text/plain markdown"
          }
        }
      }
    },
    "/api/search": {
      "get": {
        "summary": "Search topics (BM25) — JSON",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Search query"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20,
              "minimum": 1,
              "maximum": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Search results as JSON"
          }
        }
      }
    },
    "/a/hot": {
      "get": {
        "summary": "Hot topics as compact markdown",
        "parameters": [
          {
            "name": "period",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "day",
                "week",
                "month"
              ],
              "default": "day"
            },
            "description": "Hot period window"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 20,
              "minimum": 1,
              "maximum": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Compact markdown hot topics"
          }
        }
      }
    },
    "/topic": {
      "get": {
        "summary": "Get messages for a stream/topic",
        "parameters": [
          {
            "name": "stream",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "topic",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Topic messages"
          }
        }
      }
    },
    "/openapi.json": {
      "get": {
        "summary": "OpenAPI manifest",
        "responses": {
          "200": {
            "description": "OpenAPI document"
          }
        }
      }
    }
  }
}