{
  "openapi": "3.1.0",
  "info": {
    "title": "Catálogo público da DeHu Super Humanos",
    "version": "1.0.0",
    "summary": "Testes, planos e preços da DeHu, somente leitura.",
    "description": "A única API aberta da DeHu: o catálogo do que está à venda, com os mesmos números publicados em https://portaldehu.com/precos. Sem autenticação, sem dado pessoal, sem escrita. Não existe API pública de operação: convites, respostas, resultados e organizações só pelo portal, ou por integração liberada caso a caso em contrato. Documentação técnica: https://portaldehu.com/desenvolvedores. Índice do site para agentes: https://portaldehu.com/llms.txt.",
    "contact": {
      "name": "DeHu Super Humanos",
      "url": "https://portaldehu.com/contato",
      "email": "contato@dehu.com.br"
    },
    "license": {
      "name": "Termos de Uso da DeHu",
      "url": "https://portaldehu.com/termos"
    }
  },
  "servers": [
    {
      "url": "https://portaldehu.com",
      "description": "Produção"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "Catálogo",
      "description": "O que a DeHu vende e quanto custa."
    },
    {
      "name": "Erros",
      "description": "O formato de erro da pasta /api."
    }
  ],
  "paths": {
    "/api/publico/catalogo": {
      "get": {
        "operationId": "obterCatalogoPublico",
        "tags": [
          "Catálogo"
        ],
        "summary": "Catálogo de testes, planos e crédito",
        "description": "Os testes aplicáveis (DISC e Eneagrama), os planos de plataforma que se compram e a escada de crédito por volume. Valores em reais (BRL), iguais aos de /precos. Planos sem fidelidade; o Enterprise é por proposta e não aparece na lista. Resposta estática, com cache público e leitura liberada para qualquer origem (CORS).",
        "security": [],
        "responses": {
          "200": {
            "description": "O catálogo vigente.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "description": "Sempre `*`: a leitura é pública.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Cache público na borda.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Catalogo"
                },
                "examples": {
                  "vigente": {
                    "summary": "O catálogo no momento em que esta especificação foi gerada",
                    "value": {
                      "fonte": "https://portaldehu.com/precos",
                      "especificacao": "https://portaldehu.com/openapi.json",
                      "versao_da_tabela": "v5-2026-09",
                      "moeda": "BRL",
                      "testes": [
                        {
                          "id": "DISC",
                          "nome": "DISC",
                          "descricao": "Como a pessoa age, decide, se comunica e lidera",
                          "minutos_de_resposta": 15,
                          "paginas_do_relatorio": 53,
                          "pagina": "https://portaldehu.com/produtos/disc"
                        },
                        {
                          "id": "ENEAGRAMA",
                          "nome": "Eneagrama",
                          "descricao": "Por que a pessoa age assim: motivações, medos e caminhos de desenvolvimento",
                          "minutos_de_resposta": 20,
                          "paginas_do_relatorio": 67,
                          "pagina": "https://portaldehu.com/produtos/eneagrama"
                        }
                      ],
                      "planos": [
                        {
                          "id": "basic",
                          "nome": "Basic",
                          "mensalidade": 140,
                          "testes_inclusos_por_mes": 0,
                          "acessos_inclusos": 1,
                          "sub_organizacoes_inclusas": 3,
                          "marca_no_relatorio": {
                            "inclusa": false,
                            "adicional_mensal": 99
                          },
                          "destaque": false
                        },
                        {
                          "id": "essential",
                          "nome": "Essential",
                          "mensalidade": 390,
                          "testes_inclusos_por_mes": 3,
                          "acessos_inclusos": 3,
                          "sub_organizacoes_inclusas": 5,
                          "marca_no_relatorio": {
                            "inclusa": false,
                            "adicional_mensal": 99
                          },
                          "destaque": false
                        },
                        {
                          "id": "growth",
                          "nome": "Growth",
                          "mensalidade": 790,
                          "testes_inclusos_por_mes": 10,
                          "acessos_inclusos": 5,
                          "sub_organizacoes_inclusas": 10,
                          "marca_no_relatorio": {
                            "inclusa": true,
                            "adicional_mensal": null
                          },
                          "destaque": true
                        },
                        {
                          "id": "scale",
                          "nome": "Scale",
                          "mensalidade": 1490,
                          "testes_inclusos_por_mes": 25,
                          "acessos_inclusos": 10,
                          "sub_organizacoes_inclusas": 25,
                          "marca_no_relatorio": {
                            "inclusa": true,
                            "adicional_mensal": null
                          },
                          "destaque": false
                        }
                      ],
                      "credito": {
                        "preco_avulso": 150,
                        "faixas": [
                          {
                            "de": 1,
                            "ate": 9,
                            "preco_por_teste": 150
                          },
                          {
                            "de": 10,
                            "ate": 24,
                            "preco_por_teste": 140
                          },
                          {
                            "de": 25,
                            "ate": 49,
                            "preco_por_teste": 130
                          },
                          {
                            "de": 50,
                            "ate": 99,
                            "preco_por_teste": 120
                          },
                          {
                            "de": 100,
                            "ate": 199,
                            "preco_por_teste": 112
                          },
                          {
                            "de": 200,
                            "ate": 200,
                            "preco_por_teste": 105
                          }
                        ],
                        "maximo_por_compra": 200,
                        "combo_disc_e_eneagrama": 280,
                        "maximo_de_pessoas_sem_plano": 2,
                        "regras": [
                          "Um crédito é uma aplicação de teste, DISC ou Eneagrama.",
                          "A escada é a mesma para todo mundo, com ou sem plano; o preço da faixa vale para todas as unidades da compra.",
                          "Comprar mais nunca sai mais caro no total: se uma quantidade maior custar menos, cobra-se o total dela.",
                          "Acima de 200 testes numa compra, o preço é por proposta.",
                          "Sem plano, dá para aplicar em até 2 pessoas; acima disso, o portal de um plano gera e acompanha os convites."
                        ]
                      },
                      "condicoes": [
                        "Planos sem fidelidade e sem multa.",
                        "Quem para de pagar é rebaixado ao plano Free: mantém o crédito já comprado, segue gerando link e perde só as telas de gestão.",
                        "Acima do maior plano, o atendimento é por proposta (plano Enterprise).",
                        "Preço de curso e de mentoria é tratado no atendimento, não publicado."
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/{rota}": {
      "get": {
        "operationId": "rotaDeApiInexistente",
        "tags": [
          "Erros"
        ],
        "summary": "Qualquer caminho de API que não existe",
        "description": "Não é um recurso: documenta o formato do erro. Todo caminho sob /api que não seja uma rota existente responde 404 com este corpo JSON, em qualquer método. Não existe API pública de operação: convites, respostas, resultados e organizações só pelo portal, ou por integração liberada caso a caso em contrato.",
        "security": [],
        "parameters": [
          {
            "name": "rota",
            "in": "path",
            "required": true,
            "description": "Qualquer caminho que não corresponda a uma rota existente (pode ter mais de um segmento).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "404": {
            "$ref": "#/components/responses/RotaInexistente"
          }
        }
      }
    }
  },
  "components": {
    "responses": {
      "RotaInexistente": {
        "description": "A rota de API não existe.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            },
            "examples": {
              "rotaInexistente": {
                "summary": "GET /api/nao-existe",
                "value": {
                  "error": "not_found",
                  "message": "Esta rota de API não existe.",
                  "hint": "A única API pública é o catálogo somente-leitura em https://portaldehu.com/api/publico/catalogo, descrito em https://portaldehu.com/openapi.json. O resto do site está indexado em https://portaldehu.com/llms.txt."
                }
              }
            }
          }
        }
      }
    },
    "schemas": {
      "Erro": {
        "type": "object",
        "description": "Envelope de erro da pasta /api.",
        "additionalProperties": false,
        "required": [
          "error",
          "message",
          "hint"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Código estável, em snake_case, para o cliente tratar.",
            "examples": [
              "not_found"
            ]
          },
          "message": {
            "type": "string",
            "description": "O que aconteceu, em português."
          },
          "hint": {
            "type": "string",
            "description": "Por onde seguir."
          }
        }
      },
      "Catalogo": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "fonte",
          "especificacao",
          "versao_da_tabela",
          "moeda",
          "testes",
          "planos",
          "credito",
          "condicoes"
        ],
        "properties": {
          "fonte": {
            "type": "string",
            "format": "uri",
            "description": "A página humana com os mesmos números."
          },
          "especificacao": {
            "type": "string",
            "format": "uri",
            "description": "Esta especificação."
          },
          "versao_da_tabela": {
            "type": "string",
            "description": "Versão da tabela de preços; muda quando um preço muda."
          },
          "moeda": {
            "type": "string",
            "enum": [
              "BRL"
            ]
          },
          "testes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Teste"
            }
          },
          "planos": {
            "type": "array",
            "description": "Os planos que se compram, do menor para o maior.",
            "items": {
              "$ref": "#/components/schemas/Plano"
            }
          },
          "credito": {
            "$ref": "#/components/schemas/Credito"
          },
          "condicoes": {
            "type": "array",
            "description": "Regras comerciais em texto, iguais às de /precos.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Teste": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "nome",
          "descricao",
          "minutos_de_resposta",
          "paginas_do_relatorio",
          "pagina"
        ],
        "properties": {
          "id": {
            "type": "string",
            "enum": [
              "DISC",
              "ENEAGRAMA"
            ]
          },
          "nome": {
            "type": "string"
          },
          "descricao": {
            "type": "string",
            "description": "O que o teste responde, em uma frase."
          },
          "minutos_de_resposta": {
            "type": "integer",
            "description": "Tempo aproximado para responder."
          },
          "paginas_do_relatorio": {
            "type": "integer",
            "description": "Páginas do relatório individual."
          },
          "pagina": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Plano": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "nome",
          "mensalidade",
          "testes_inclusos_por_mes",
          "acessos_inclusos",
          "sub_organizacoes_inclusas",
          "marca_no_relatorio",
          "destaque"
        ],
        "properties": {
          "id": {
            "type": "string",
            "enum": [
              "basic",
              "essential",
              "growth",
              "scale"
            ]
          },
          "nome": {
            "type": "string"
          },
          "mensalidade": {
            "type": "number",
            "description": "Valor mensal em reais. Sem fidelidade e sem multa."
          },
          "testes_inclusos_por_mes": {
            "type": "integer",
            "description": "Créditos liberados a cada mês pago; acumulam enquanto o plano vive."
          },
          "acessos_inclusos": {
            "type": "integer",
            "description": "Pessoas que entram no portal, contando o titular."
          },
          "sub_organizacoes_inclusas": {
            "type": "integer",
            "description": "Divisões (setor, filial ou cliente atendido) com saldo próprio."
          },
          "marca_no_relatorio": {
            "type": "object",
            "description": "Relatório com a marca de quem aplica (co-branding).",
            "additionalProperties": false,
            "required": [
              "inclusa",
              "adicional_mensal"
            ],
            "properties": {
              "inclusa": {
                "type": "boolean"
              },
              "adicional_mensal": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Valor mensal do adicional; null quando vem incluso."
              }
            }
          },
          "destaque": {
            "type": "boolean",
            "description": "O plano que a vitrine recomenda."
          }
        }
      },
      "Faixa": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "de",
          "ate",
          "preco_por_teste"
        ],
        "properties": {
          "de": {
            "type": "integer",
            "description": "Menor quantidade da faixa."
          },
          "ate": {
            "type": "integer",
            "description": "Maior quantidade da faixa."
          },
          "preco_por_teste": {
            "type": "number",
            "description": "Preço de cada teste, em reais, para compras nesta faixa."
          }
        }
      },
      "Credito": {
        "type": "object",
        "description": "Crédito de teste: um crédito é uma aplicação, DISC ou Eneagrama.",
        "additionalProperties": false,
        "required": [
          "preco_avulso",
          "faixas",
          "maximo_por_compra",
          "combo_disc_e_eneagrama",
          "maximo_de_pessoas_sem_plano",
          "regras"
        ],
        "properties": {
          "preco_avulso": {
            "type": "number",
            "description": "Um teste comprado sozinho."
          },
          "faixas": {
            "type": "array",
            "description": "A escada por volume, a mesma para todo mundo.",
            "items": {
              "$ref": "#/components/schemas/Faixa"
            }
          },
          "maximo_por_compra": {
            "type": "integer",
            "description": "Acima disso, o preço é por proposta."
          },
          "combo_disc_e_eneagrama": {
            "type": "number",
            "description": "Os dois testes para a mesma pessoa."
          },
          "maximo_de_pessoas_sem_plano": {
            "type": "integer",
            "description": "Sem plano, quantas pessoas dá para avaliar."
          },
          "regras": {
            "type": "array",
            "description": "Como o total é calculado.",
            "items": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}