{
  "openapi": "3.1.0",
  "info": {
    "title": "drophost API",
    "version": "0.3.0",
    "description": "Static HTML hosting. Private by default. No API key required for upload; management uses X-Mgmt-Token. Admin endpoints require an ADMIN_EMAILS session."
  },
  "servers": [{ "url": "https://drophost.ai" }],
  "paths": {
    "/api/health": {
      "get": {
        "summary": "Health check",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": { "type": "boolean" },
                    "service": { "type": "string" }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/upload": {
      "post": {
        "summary": "Create a site",
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": ["file"],
                "properties": {
                  "file": { "type": "string", "format": "binary" },
                  "name": { "type": "string" },
                  "password": { "type": "string" },
                  "cf-turnstile-response": { "type": "string" }
                }
              }
            }
          }
        },
        "responses": {
          "201": { "description": "Created" },
          "400": { "description": "Validation error" }
        }
      }
    },
    "/api/sites/{slug}": {
      "get": {
        "summary": "Public site metadata",
        "parameters": [
          { "name": "slug", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "responses": { "200": { "description": "OK" }, "404": { "description": "Not found" } }
      },
      "put": {
        "summary": "Replace site contents",
        "parameters": [
          { "name": "slug", "in": "path", "required": true, "schema": { "type": "string" } },
          { "name": "X-Mgmt-Token", "in": "header", "required": true, "schema": { "type": "string" } }
        ],
        "responses": { "200": { "description": "OK" }, "401": { "description": "Unauthorized" } }
      },
      "patch": {
        "summary": "Update site settings",
        "parameters": [
          { "name": "slug", "in": "path", "required": true, "schema": { "type": "string" } },
          { "name": "X-Mgmt-Token", "in": "header", "required": true, "schema": { "type": "string" } }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": { "type": "string" },
                  "password": { "type": "string" },
                  "is_public": { "type": "boolean" }
                }
              }
            }
          }
        },
        "responses": { "200": { "description": "OK" } }
      },
      "delete": {
        "summary": "Delete site",
        "parameters": [
          { "name": "slug", "in": "path", "required": true, "schema": { "type": "string" } },
          { "name": "X-Mgmt-Token", "in": "header", "required": true, "schema": { "type": "string" } }
        ],
        "responses": { "204": { "description": "Deleted" } }
      }
    },
    "/api/report": {
      "post": {
        "summary": "Report abuse",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["slug"],
                "properties": {
                  "slug": { "type": "string" },
                  "reason": { "type": "string" }
                }
              }
            }
          }
        },
        "responses": { "201": { "description": "Recorded" } }
      }
    },
    "/api/admin/analytics": {
      "get": {
        "summary": "Admin usage rollups (session + admin role)",
        "parameters": [
          {
            "name": "slug",
            "in": "query",
            "required": false,
            "schema": { "type": "string" },
            "description": "Optional site slug filter"
          }
        ],
        "responses": {
          "200": { "description": "Daily rollups from site_usage_daily" },
          "401": { "description": "Sign-in required" },
          "403": { "description": "Admin only" }
        }
      }
    },
    "/api/keep/{slug}": {
      "get": {
        "summary": "Keep an expiring private site (signed email link)",
        "parameters": [
          { "name": "slug", "in": "path", "required": true, "schema": { "type": "string" } },
          { "name": "sig", "in": "query", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "302": { "description": "Redirect to dashboard" },
          "403": { "description": "Invalid or expired signature" }
        }
      }
    }
  }
}
