{
  "openapi": "3.1.0",
  "info": {
    "title": "BeePhish Content API (leitura pública)",
    "version": "1.0.0",
    "summary": "Endpoints públicos e somente leitura para agentes de IA ingerirem o conteúdo de beephish.com.",
    "description": "A BeePhish é uma plataforma SaaS brasileira de Gestão de Risco Humano (simulações de phishing, treinamentos de conscientização e o score BHRS).\n\nEsta especificação descreve APENAS a superfície pública de conteúdo do site institucional: espelhos Markdown das páginas, inventário de URLs e arquivos de instrução para agentes. Não existe API pública do produto (dados de clientes, campanhas ou scores). Integrações de produto são tratadas comercialmente em https://beephish.com/contato.\n\nTodos os endpoints são GET, sem autenticação e sem efeitos colaterais.",
    "contact": {
      "name": "BeePhish",
      "email": "contato@beephish.com",
      "url": "https://beephish.com/contato"
    },
    "license": {
      "name": "Conteúdo público citável com atribuição e link canônico",
      "url": "https://beephish.com/AGENTS.md"
    }
  },
  "servers": [
    { "url": "https://beephish.com", "description": "Site canônico (HTML, sitemap, llms.txt, AGENTS.md)" },
    {
      "url": "https://kvlbuwxkkllobkgvzsam.supabase.co/functions/v1",
      "description": "Gateway Markdown (Content-Type text/markdown correto e Link headers RFC 8288)"
    }
  ],
  "tags": [
    { "name": "content", "description": "Conteúdo das páginas em Markdown" },
    { "name": "discovery", "description": "Inventários e instruções para agentes" }
  ],
  "paths": {
    "/md": {
      "get": {
        "operationId": "getHomeMarkdown",
        "tags": ["content"],
        "summary": "Markdown da home",
        "description": "Retorna o conteúdo da página inicial de beephish.com em Markdown, com Content-Type text/markdown e Link headers (canonical, alternate, describedby, author, sitemap). Use este endpoint como ponto de entrada quando quiser uma visão geral da BeePhish.",
        "servers": [{ "url": "https://kvlbuwxkkllobkgvzsam.supabase.co/functions/v1" }],
        "responses": {
          "200": { "$ref": "#/components/responses/MarkdownOk" },
          "404": { "$ref": "#/components/responses/NotFound" }
        }
      }
    },
    "/md/{path}": {
      "get": {
        "operationId": "getPageMarkdown",
        "tags": ["content"],
        "summary": "Markdown de qualquer página canônica",
        "description": "Retorna o conteúdo de uma rota pública de beephish.com em Markdown. O parâmetro `path` é a rota canônica sem a barra inicial — por exemplo `plataforma`, `plataforma/gestao-risco/bhrs` ou `blog/guia-completo-de-simulacao-de-phishing`. Rotas válidas estão listadas em /sitemap.xml e /llms.txt. Caminhos inexistentes retornam HTTP 404 com corpo explicativo.",
        "servers": [{ "url": "https://kvlbuwxkkllobkgvzsam.supabase.co/functions/v1" }],
        "parameters": [
          {
            "name": "path",
            "in": "path",
            "required": true,
            "description": "Rota canônica sem barra inicial (letras minúsculas, números, hífens e barras).",
            "schema": { "type": "string", "pattern": "^[a-z0-9\\-/]+$", "examples": ["plataforma", "blog/medindo-o-sucesso-real"] }
          },
          {
            "name": "Accept",
            "in": "header",
            "required": false,
            "description": "Use `text/markdown` para o conteúdo e `application/json` para receber erros estruturados em JSON.",
            "schema": { "type": "string", "enum": ["text/markdown", "application/json"] }
          }
        ],
        "responses": {
          "200": { "$ref": "#/components/responses/MarkdownOk" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "405": { "$ref": "#/components/responses/MethodNotAllowed" }
        }
      }
    },
    "/sitemap.xml": {
      "get": {
        "operationId": "getSitemap",
        "tags": ["discovery"],
        "summary": "Inventário completo de URLs",
        "description": "Sitemap XML com todas as URLs canônicas públicas do site, incluindo blog, mídia, webinars, podcasts, casos de uso e páginas de research.",
        "servers": [{ "url": "https://beephish.com" }],
        "responses": {
          "200": {
            "description": "Sitemap XML",
            "content": { "application/xml": { "schema": { "type": "string" } } }
          }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "operationId": "getLlmsTxt",
        "tags": ["discovery"],
        "summary": "Índice para modelos de linguagem (llmstxt.org)",
        "description": "Índice legível por LLMs com a descrição da BeePhish, a seção 'Quando usar a BeePhish' e a lista de páginas com seus espelhos Markdown.",
        "servers": [{ "url": "https://beephish.com" }],
        "responses": {
          "200": {
            "description": "Arquivo llms.txt",
            "content": { "text/plain": { "schema": { "type": "string" } } }
          }
        }
      }
    },
    "/AGENTS.md": {
      "get": {
        "operationId": "getAgentsInstructions",
        "tags": ["discovery"],
        "summary": "Instruções canônicas para agentes de IA",
        "description": "Guia com identidade, glossário, fatos oficiais citáveis, quando usar a BeePhish e restrições (não inventar preços, não citar clientes não públicos).",
        "servers": [{ "url": "https://beephish.com" }],
        "responses": {
          "200": {
            "description": "Arquivo AGENTS.md",
            "content": { "text/markdown": { "schema": { "type": "string" } } }
          }
        }
      }
    }
  },
  "components": {
    "responses": {
      "MarkdownOk": {
        "description": "Conteúdo da página em Markdown.",
        "headers": {
          "Link": {
            "description": "Relações RFC 8288: canonical, alternate, describedby, author, sitemap.",
            "schema": { "type": "string" }
          }
        },
        "content": { "text/markdown": { "schema": { "type": "string" } } }
      },
      "BadRequest": {
        "description": "Caminho inválido.",
        "content": {
          "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } },
          "text/markdown": { "schema": { "type": "string" } }
        }
      },
      "NotFound": {
        "description": "Não existe página canônica para o caminho informado.",
        "content": {
          "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } },
          "text/markdown": { "schema": { "type": "string" } }
        }
      },
      "MethodNotAllowed": {
        "description": "Somente GET e HEAD são aceitos.",
        "content": {
          "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } },
          "text/markdown": { "schema": { "type": "string" } }
        }
      }
    },
    "schemas": {
      "ErrorResponse": {
        "type": "object",
        "required": ["error"],
        "properties": {
          "error": {
            "type": "object",
            "required": ["code", "message"],
            "properties": {
              "code": {
                "type": "string",
                "description": "Código estável do erro.",
                "enum": ["invalid_path", "not_found", "method_not_allowed", "upstream_error"]
              },
              "message": { "type": "string", "description": "Descrição legível do erro." },
              "hint": { "type": "string", "description": "Como resolver — normalmente um inventário de URLs." },
              "path": { "type": "string", "description": "Rota solicitada, quando aplicável." }
            }
          }
        }
      }
    }
  }
}
