{
  "openapi": "3.1.0",
  "info": {
    "title": "API da Certu (REST e MCP)",
    "summary": "Operar uma conta da Certu (IA de WhatsApp, CRM, agenda, Cérebro, anúncios, site e mais) por REST ou MCP.",
    "description": "A API da Certu opera a conta de quem criou a chave: conversas do WhatsApp, Cérebro (a base de conhecimento da IA), produtos, a IA que atende o WhatsApp, CRM, agenda, ligações, controle do negócio (estoque, caixa, pedidos, cobranças), anúncios sempre criados pausados, site e o perfil do Google. As mesmas ferramentas atendem o REST (este documento) e o servidor MCP.\n\n**Começar sem custo:** 7 dias grátis, sem cartão. Crie a conta em https://certu.com.br/criar-meu-agente e veja os planos em https://certu.com.br/planos.\n\n**Chave (autoatendimento):** no app, em Ajustes, seção Conectar ao Claude, o dono cria a chave (`certu_sk_...`). Ela aparece uma vez só. Mande no cabeçalho `Authorization: Bearer <chave>`, nunca na URL.\n\n**Chave de teste (sandbox):** chave `certu_sk_test_...` lê os dados reais e simula toda escrita: valida os parâmetros e devolve `sandbox: true` sem gravar, gastar crédito nem mandar nada. Crie com `POST /api/v1/keys` autenticado pelo login do app, corpo `{\"nome\": \"...\", \"teste\": true}`. O mesmo endereço aceita `escopos` (por exemplo `[\"crm:ler\", \"agenda:escrever\"]`) pra restringir a chave.\n\n**Limites:** 60 pedidos por minuto por chave, 5 chaves ativas e 2.000 chamadas por dia por conta. Corpo até 1 MB. Cada ação ainda segue o plano e os créditos da conta.\n\n**MCP:** `POST https://certu.com.br/api/v1/mcp` (Streamable HTTP, sem estado, só JSON), mesma chave Bearer, ou o conector do claude.ai com login OAuth. Guia: https://certu.com.br/claude\n\n**Outra conta:** parceiro, dono de mais de um negócio ou admin passa `conta` (query, ou no corpo dos POST) pra agir naquela conta; a lista sai de `GET /parceiro/clientes`.\n\n**Respostas:** toda operação declara o formato do 200 em `components.schemas` (`<Ferramenta>Resposta`). Com chave de teste, a ferramenta que grava devolve `SimulacaoSandbox`.\n\n**Erros:** todo 4xx e 5xx do REST vem no mesmo formato, o esquema `Erro`: `{\"error\": \"<codigo>\", \"message\": \"<texto>\"}`, às vezes com `detalhes` (lista de textos), e o status HTTP. Confie no `error`, que é estável; o `message` é pra pessoa ler. No MCP, erro de protocolo volta em JSON-RPC 2.0 (`error.code`) e erro de ferramenta volta como resultado com `isError: true`.\n\n**Limite:** toda resposta leva `RateLimit-Policy` (`\"minuto\";q=<limite>;w=60`, IETF draft-ietf-httpapi-ratelimit-headers); depois de a chave ser contada, também `RateLimit` (`\"minuto\";r=<restante>;t=<segundos>`), `X-RateLimit-Limit` e `X-RateLimit-Remaining`. O 429 traz `Retry-After`.\n\n**Versionamento e descontinuação:** a v1 só muda por acréscimo (campo novo, endereço novo, parâmetro opcional novo). O que quebrar compatibilidade sai num caminho novo (`/api/v2`). Antes de remover ou mudar qualquer coisa da v1, a Certu avisa por e-mail quem tem chave e manda, nas respostas dos endereços afetados, os cabeçalhos `Deprecation` (RFC 9745) e `Sunset` (RFC 8594) com a data. Operação em descontinuação aparece com `deprecated: true` nesta especificação. Detalhes: https://certu.com.br/docs#versionamento\n\nDocumentação: https://certu.com.br/docs",
    "version": "1.0.0",
    "contact": {
      "url": "https://certu.com.br/docs"
    }
  },
  "externalDocs": {
    "description": "Documentação da API e do MCP da Certu",
    "url": "https://certu.com.br/docs"
  },
  "servers": [
    {
      "url": "https://certu.com.br/api/v1"
    }
  ],
  "security": [
    {
      "chave": []
    }
  ],
  "tags": [
    {
      "name": "conta"
    },
    {
      "name": "conversas"
    },
    {
      "name": "cerebro"
    },
    {
      "name": "agente"
    },
    {
      "name": "anuncios"
    },
    {
      "name": "site"
    },
    {
      "name": "google"
    },
    {
      "name": "parceiro"
    },
    {
      "name": "crm"
    },
    {
      "name": "ligacoes"
    },
    {
      "name": "erp"
    },
    {
      "name": "agenda"
    },
    {
      "name": "cobrancas"
    },
    {
      "name": "pets"
    },
    {
      "name": "imoveis"
    },
    {
      "name": "fiscal"
    },
    {
      "name": "clinica"
    },
    {
      "name": "mcp",
      "description": "Servidor MCP"
    }
  ],
  "paths": {
    "/conta": {
      "get": {
        "operationId": "conta_resumo",
        "summary": "Resumo da conta",
        "description": "Mostra o plano da conta Certu, os créditos que restam no mês e o que o plano inclui (Gestor de tráfego pago, publicar site, Instagram e Messenger, ERP). Mostra também quais recursos o plano não inclui.",
        "tags": [
          "conta"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContaResumoResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "conta_resumo",
        "x-scope": "conta:ler",
        "x-read-only": true
      }
    },
    "/conversas": {
      "get": {
        "operationId": "conversas_listar",
        "summary": "Listar conversas",
        "description": "Lista as conversas mais recentes (WhatsApp e outros canais), da mais nova pra mais velha, com a última mensagem de cada uma. Os filtros olham só as conversas mais recentes da conta, não o histórico inteiro. Só leitura: não manda mensagem pra ninguém.",
        "tags": [
          "conversas"
        ],
        "parameters": [
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantas conversas devolver. Padrão 20.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "canal",
            "in": "query",
            "required": false,
            "description": "Só conversas deste canal.",
            "schema": {
              "type": "string",
              "enum": [
                "whatsapp",
                "instagram",
                "facebook",
                "site",
                "email",
                "youtube",
                "linkedin",
                "custom"
              ]
            }
          },
          {
            "name": "nao_lidas",
            "in": "query",
            "required": false,
            "description": "Só conversas com mensagem nova que ninguém abriu.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConversasListarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "conversas_listar",
        "x-scope": "conversas:ler",
        "x-read-only": true
      }
    },
    "/conversas/{contato}": {
      "get": {
        "operationId": "conversa_ler",
        "summary": "Ler uma conversa",
        "description": "Lê o histórico de uma conversa: o que o cliente escreveu e o que a empresa respondeu, da mais antiga pra mais nova. O `contato` é o mesmo que aparece na lista de conversas. Só leitura.",
        "tags": [
          "conversas"
        ],
        "parameters": [
          {
            "name": "contato",
            "in": "path",
            "required": true,
            "description": "O `contato` que conversas_listar devolveu.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            }
          },
          {
            "name": "canal",
            "in": "query",
            "required": false,
            "description": "O canal da conversa, quando o mesmo contato aparece em mais de um.",
            "schema": {
              "type": "string",
              "enum": [
                "whatsapp",
                "instagram",
                "facebook",
                "site",
                "email",
                "youtube",
                "linkedin",
                "custom"
              ]
            }
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantas mensagens do fim da conversa. Padrão 100.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 600
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConversaLerResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "conversa_ler",
        "x-scope": "conversas:ler",
        "x-read-only": true
      }
    },
    "/cerebro": {
      "get": {
        "operationId": "cerebro_listar",
        "summary": "Listar fichas do Cérebro",
        "description": "Lista as fichas do Cérebro, a base de conhecimento que a IA usa pra responder os clientes do jeito da empresa. Aceita busca por palavra e filtro por categoria.",
        "tags": [
          "cerebro"
        ],
        "parameters": [
          {
            "name": "busca",
            "in": "query",
            "required": false,
            "description": "Palavra ou trecho procurado no título ou no conteúdo.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          },
          {
            "name": "categoria",
            "in": "query",
            "required": false,
            "description": "Só fichas desta categoria.",
            "schema": {
              "type": "string",
              "maxLength": 60
            }
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantas fichas devolver. Padrão 100.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CerebroListarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "cerebro_listar",
        "x-scope": "cerebro:ler",
        "x-read-only": true
      },
      "post": {
        "operationId": "cerebro_salvar",
        "summary": "Salvar ficha no Cérebro",
        "description": "Cria uma ficha no Cérebro ou atualiza uma existente (mande o `id` pra atualizar). A IA passa a usar a ficha nas próximas respostas.",
        "tags": [
          "cerebro"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CerebroSalvarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "423": {
            "$ref": "#/components/responses/Erro423"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "cerebro_salvar",
        "x-scope": "cerebro:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "titulo",
                  "conteudo"
                ],
                "properties": {
                  "titulo": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 160,
                    "description": "Assunto da ficha, como o cliente perguntaria."
                  },
                  "conteudo": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 8000,
                    "description": "A resposta certa, com os fatos da empresa."
                  },
                  "categoria": {
                    "type": "string",
                    "maxLength": 60,
                    "description": "Categoria livre, por exemplo Preços ou Entrega."
                  },
                  "id": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9_-]{1,64}$",
                    "description": "Id de uma ficha existente, pra atualizar."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/cerebro/apagar": {
      "post": {
        "operationId": "cerebro_apagar",
        "summary": "Apagar fichas do Cérebro",
        "description": "Apaga fichas do Cérebro pelo id da ficha. Só apaga com `confirmado_pelo_dono: true`, que declara que o dono viu a lista e aprovou. A ficha apagada some das respostas da IA na hora e fica registrada na auditoria da conta.",
        "tags": [
          "cerebro"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CerebroApagarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "423": {
            "$ref": "#/components/responses/Erro423"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "cerebro_apagar",
        "x-scope": "cerebro:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "ids",
                  "confirmado_pelo_dono"
                ],
                "properties": {
                  "ids": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 50,
                    "items": {
                      "type": "string",
                      "pattern": "^[A-Za-z0-9_-]{1,64}$"
                    },
                    "description": "Ids das fichas a apagar."
                  },
                  "confirmado_pelo_dono": {
                    "type": "boolean",
                    "description": "true só depois de o dono ver a lista e dizer sim nesta conversa."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/produtos": {
      "get": {
        "operationId": "produtos_listar",
        "summary": "Listar produtos e serviços",
        "description": "Lista os produtos e serviços cadastrados, com preço e disponibilidade. É daqui que a IA tira os preços.",
        "tags": [
          "cerebro"
        ],
        "parameters": [
          {
            "name": "busca",
            "in": "query",
            "required": false,
            "description": "Palavra no nome ou na descrição.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProdutosListarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "produtos_listar",
        "x-scope": "cerebro:ler",
        "x-read-only": true
      },
      "post": {
        "operationId": "produto_salvar",
        "summary": "Salvar produto ou serviço",
        "description": "Cria um produto ou serviço, ou atualiza um existente pelo `id`. Na atualização só mudam os campos enviados; o resto (código, estoque, custo, dados fiscais) fica como está.",
        "tags": [
          "cerebro"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProdutoSalvarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "produto_salvar",
        "x-scope": "cerebro:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "id": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9_-]{1,64}$",
                    "description": "Id de um produto existente, pra atualizar."
                  },
                  "nome": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "description": "Nome do produto ou serviço. Obrigatório pra criar."
                  },
                  "preco": {
                    "type": "string",
                    "maxLength": 60,
                    "description": "Preço como o cliente deve ouvir, por exemplo \"R$ 89,90\" ou \"a partir de R$ 150\"."
                  },
                  "descricao": {
                    "type": "string",
                    "maxLength": 2000,
                    "description": "Descrição curta."
                  },
                  "disponivel": {
                    "type": "boolean",
                    "description": "false quando está em falta ou fora de venda."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/agente": {
      "get": {
        "operationId": "agente_ler",
        "summary": "Ver a configuração da IA",
        "description": "Mostra como está a IA que atende no WhatsApp: ligada ou não, pausa, modo rascunho, horário de atendimento, avisos pro dono, contatos bloqueados e o resto da configuração.",
        "tags": [
          "agente"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgenteLerResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "agente_ler",
        "x-scope": "agente:ler",
        "x-read-only": true
      },
      "patch": {
        "operationId": "agente_ajustar",
        "summary": "Ajustar a IA",
        "description": "Muda interruptores da IA que atende: ligar ou desligar, pausar, modo rascunho, marcar horário sozinha, horário de atendimento, avisos e contatos bloqueados. Só aceita esses campos. Desligar ou pausar faz a IA parar de responder os clientes.",
        "tags": [
          "agente"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgenteAjustarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "agente_ajustar",
        "x-scope": "agente:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "ajustes"
                ],
                "properties": {
                  "ajustes": {
                    "type": "object",
                    "additionalProperties": false,
                    "minProperties": 1,
                    "properties": {
                      "botEnabled": {
                        "type": "boolean",
                        "description": "IA ligada (true) ou desligada (false). Desligada, ela não responde ninguém."
                      },
                      "pausedUntil": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Pausa a IA até este instante, em milissegundos desde 1970 (UTC). 0 tira a pausa."
                      },
                      "draftMode": {
                        "type": "boolean",
                        "description": "Modo rascunho: a IA escreve a resposta e espera o dono aprovar no app."
                      },
                      "autoBook": {
                        "type": "boolean",
                        "description": "A IA marca horário sozinha pelo WhatsApp."
                      },
                      "mostrarDigitando": {
                        "type": "boolean",
                        "description": "Mostra \"digitando…\" pro cliente no WhatsApp enquanto a IA escreve. Desligado por padrão."
                      },
                      "baloes": {
                        "type": "boolean",
                        "description": "A IA responde em até 3 balões separados, como o dono escreve. Desligado por padrão."
                      },
                      "assinarMensagens": {
                        "type": "boolean",
                        "description": "Resposta mandada por uma pessoa pela caixa chega pro cliente com o nome de quem escreveu em cima."
                      },
                      "businessHours": {
                        "type": "object",
                        "description": "Horário de atendimento. Só os campos enviados mudam; o resto continua como está.",
                        "properties": {
                          "enabled": {
                            "type": "boolean",
                            "description": "Respeitar o horário (true) ou atender a qualquer hora (false)."
                          },
                          "days": {
                            "type": "array",
                            "maxItems": 7,
                            "items": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 6
                            },
                            "description": "Dias abertos. 0 é domingo, 6 é sábado."
                          },
                          "open": {
                            "type": "string",
                            "pattern": "^\\d{2}:\\d{2}$",
                            "description": "Abre às, no formato HH:MM."
                          },
                          "close": {
                            "type": "string",
                            "pattern": "^\\d{2}:\\d{2}$",
                            "description": "Fecha às, no formato HH:MM."
                          },
                          "message": {
                            "type": "string",
                            "maxLength": 1000,
                            "description": "O que a IA diz fora do horário."
                          },
                          "mode": {
                            "type": "string",
                            "enum": [
                              "inside",
                              "outside"
                            ],
                            "description": "inside: atende no horário. outside: atende só fora dele."
                          },
                          "silent": {
                            "type": "boolean",
                            "description": "Na janela em que não atende, não manda mensagem nenhuma."
                          },
                          "triage": {
                            "type": "boolean",
                            "description": "Fora do horário, faz a triagem inteira e avisa que o retorno vem depois."
                          },
                          "perDay": {
                            "type": "object",
                            "description": "Horário diferente por dia: {\"6\": {\"open\": \"09:00\", \"close\": \"13:00\"}}."
                          }
                        }
                      },
                      "notifyChannels": {
                        "type": "string",
                        "enum": [
                          "both",
                          "whatsapp",
                          "email"
                        ],
                        "description": "Onde o dono recebe avisos: both (WhatsApp e e-mail), whatsapp ou email."
                      },
                      "notifyEmails": {
                        "type": "array",
                        "maxItems": 10,
                        "items": {
                          "type": "string",
                          "maxLength": 200
                        },
                        "description": "E-mails que recebem os avisos. A lista mandada substitui a atual."
                      },
                      "ownerPhone": {
                        "type": "string",
                        "maxLength": 20,
                        "description": "Telefone do dono para avisos, com DDD, só números."
                      },
                      "notifyPhones": {
                        "type": "array",
                        "maxItems": 4,
                        "items": {
                          "type": "string",
                          "maxLength": 20
                        },
                        "description": "Outros WhatsApps que recebem os mesmos avisos, além do telefone do dono. Com DDD. A lista mandada substitui a atual."
                      },
                      "plantaoPhone": {
                        "type": "string",
                        "maxLength": 20,
                        "description": "WhatsApp de quem está de plantão: recebe toda emergência, além dos outros destinos. Com DDD. Vazio tira."
                      },
                      "blockedContacts": {
                        "type": "array",
                        "maxItems": 1000,
                        "items": {
                          "type": "string",
                          "maxLength": 40
                        },
                        "description": "Telefones que a IA não responde. A lista mandada substitui a atual inteira: leia antes com agente_ler."
                      },
                      "onlyAnswerContacts": {
                        "type": "array",
                        "maxItems": 2000,
                        "items": {
                          "type": "string",
                          "maxLength": 40
                        },
                        "description": "Se tiver números, a IA responde SÓ estes telefones e fica calada com o resto. Vazia = responde todo mundo. A lista mandada substitui a atual inteira: leia antes com agente_ler."
                      },
                      "onlyAnswerAlsoAds": {
                        "type": "boolean",
                        "description": "Com onlyAnswerContacts preenchida: true = a IA também responde quem chegou por anúncio, mesmo fora da lista. Sem lista, não muda nada."
                      },
                      "onlyAnswerAlsoNew": {
                        "type": "boolean",
                        "description": "Com onlyAnswerContacts preenchida: true = a IA também responde contato NOVO (quem escreve primeiro, sem conversa anterior com o número), mesmo fora da lista. Sem lista, não muda nada."
                      },
                      "alerts": {
                        "type": "object",
                        "description": "Como cada aviso chega, no mesmo formato em que a configuração da IA mostra os avisos."
                      },
                      "dailyDigest": {
                        "type": "boolean",
                        "description": "Resumo do dia pela manhã."
                      },
                      "dailyDigestAsked": {
                        "type": "boolean",
                        "description": "Marca que o dono já respondeu se quer o resumo da manhã."
                      },
                      "eveningDigest": {
                        "type": "boolean",
                        "description": "Resumo no fim do dia."
                      },
                      "eveningDigestHour": {
                        "type": "integer",
                        "minimum": 12,
                        "maximum": 23,
                        "description": "Hora do resumo do fim do dia (12 a 23)."
                      },
                      "eveningDigestChannel": {
                        "type": "string",
                        "enum": [
                          "both",
                          "whatsapp",
                          "email"
                        ],
                        "description": "Por onde chega o resumo do fim do dia."
                      },
                      "eveningDigestPhone": {
                        "type": "string",
                        "maxLength": 20,
                        "description": "Telefone que recebe o resumo do fim do dia."
                      },
                      "timezone": {
                        "type": "string",
                        "maxLength": 60,
                        "description": "Fuso horário, por exemplo America/Sao_Paulo."
                      },
                      "reminderOffsetsMin": {
                        "type": "array",
                        "items": {
                          "type": "integer",
                          "minimum": 15,
                          "maximum": 10080
                        },
                        "maxItems": 3,
                        "description": "Quantos minutos antes do horário marcado sai cada lembrete (15 a 10080, até 3). Padrão [1440, 60]. Sai perto desse horário, não no minuto exato."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/agente/criar": {
      "post": {
        "operationId": "agente_criar",
        "summary": "Montar o atendente de WhatsApp",
        "description": "Monta a IA que atende o WhatsApp do negócio, do jeito que o /criar-meu-agente monta: regras, saudação, nome da IA, o ramo e o Cérebro (fichas e produtos). Recebe o nome da IA, o nome do negócio, o ramo, o que ela deve fazer (atender, agendar, vender, fazer follow-up) e, se houver, o site ou o @ do Instagram. Com site, as fichas e os produtos vêm dele. Sem site, as fichas e os produtos vêm de `fichas` e `produtos` (preços, horário, endereço, formas de pagamento, dúvidas comuns); ramo com modelo pronto ganha fichas de partida com [PREENCHER]. Conta que já tem atendente é recusada, a não ser com `substituir: true`, que troca a persona (regras, saudação, nome) e a ficha \"Sobre o negócio\", e mantém horário, avisos e o resto do Cérebro. NÃO conecta o número nem cobra nada: o resultado traz o link pra ler o QR code e diz se falta escolher plano.",
        "tags": [
          "agente"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgenteCriarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "agente_criar",
        "x-scope": "agente:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "nome_ia",
                  "trabalhos"
                ],
                "properties": {
                  "nome_ia": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 30,
                    "description": "Como a IA se chama, por exemplo \"Sofia\"."
                  },
                  "nome_negocio": {
                    "type": "string",
                    "maxLength": 60,
                    "description": "Nome do negócio. Vazio quando ainda não tem nome."
                  },
                  "ramo": {
                    "type": "string",
                    "maxLength": 80,
                    "description": "O ramo nas palavras do dono, por exemplo \"clínica odontológica\" ou \"lava jato\"."
                  },
                  "segmento": {
                    "type": "string",
                    "enum": [
                      "imobiliaria",
                      "clinica",
                      "salao",
                      "restaurante",
                      "oficina",
                      "academia",
                      "servicos",
                      "distribuidora",
                      "mentoria",
                      "advocacia"
                    ],
                    "description": "O ramo na lista fechada, quando algum servir. Escolhe o funil do CRM e as fichas de partida. Na dúvida, não mande."
                  },
                  "trabalhos": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 4,
                    "items": {
                      "type": "string",
                      "enum": [
                        "atendimento",
                        "agendamento",
                        "followup",
                        "vendas"
                      ]
                    },
                    "description": "O que a IA faz: atendimento, agendamento (marca horário sozinha), vendas, followup (volta a falar com quem sumiu)."
                  },
                  "descricao": {
                    "type": "string",
                    "maxLength": 400,
                    "description": "O que o negócio faz e o que o dono quer que a IA resolva, nas palavras dele."
                  },
                  "site": {
                    "type": "string",
                    "maxLength": 300,
                    "description": "Site do negócio ou @ do Instagram. Opcional."
                  },
                  "fichas": {
                    "type": "array",
                    "maxItems": 40,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "titulo",
                        "conteudo"
                      ],
                      "properties": {
                        "titulo": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 160,
                          "description": "Assunto da ficha, como o cliente perguntaria."
                        },
                        "conteudo": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 8000,
                          "description": "A resposta certa, com os fatos que o dono deu."
                        },
                        "categoria": {
                          "type": "string",
                          "maxLength": 60
                        }
                      }
                    },
                    "description": "Fichas do Cérebro escritas a partir do que o dono te contou."
                  },
                  "produtos": {
                    "type": "array",
                    "maxItems": 60,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "nome"
                      ],
                      "properties": {
                        "nome": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 120
                        },
                        "preco": {
                          "type": "string",
                          "maxLength": 60,
                          "description": "Como o cliente deve ouvir, por exemplo \"R$ 89,90\" ou \"a partir de R$ 150\"."
                        },
                        "descricao": {
                          "type": "string",
                          "maxLength": 2000
                        }
                      }
                    },
                    "description": "Produtos ou serviços com preço, do que o dono te contou."
                  },
                  "lingua": {
                    "type": "string",
                    "enum": [
                      "pt",
                      "en"
                    ],
                    "description": "Língua em que a IA vai responder os clientes. \"en\" pra negócio cujos clientes falam inglês; \"pt\" pra negócio no Brasil. Sem o campo, sai em português."
                  },
                  "substituir": {
                    "type": "boolean",
                    "description": "true troca um atendente que já existe. Só com o dono de acordo."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/agente/testar": {
      "post": {
        "operationId": "agente_testar",
        "summary": "Testar o atendente",
        "description": "Conversa com a IA do negócio como se fosse um cliente no WhatsApp e devolve a resposta dela. É o mesmo ensaio do app: mesmo prompt, mesmo Cérebro, mesmos produtos. Nada é enviado pra ninguém, nada é agendado, ninguém é avisado. `conversa` leva a conversa inteira até aqui (a última fala é do cliente). `semResposta: true` quer dizer que a IA não sabia a resposta.",
        "tags": [
          "agente"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgenteTestarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "agente_testar",
        "x-scope": "agente:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "conversa"
                ],
                "properties": {
                  "conversa": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 24,
                    "description": "As falas em ordem. `de` é \"cliente\" ou \"ia\". A última tem que ser do cliente.",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "de",
                        "texto"
                      ],
                      "properties": {
                        "de": {
                          "type": "string",
                          "enum": [
                            "cliente",
                            "ia"
                          ]
                        },
                        "texto": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 4000
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/anuncios": {
      "get": {
        "operationId": "anuncios_listar",
        "summary": "Listar kits de campanha",
        "description": "Lista os kits de campanha já gerados, com o resultado dos que foram publicados. Com `kit_id`, devolve o kit inteiro.",
        "tags": [
          "anuncios"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KitsDeCampanha"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "anuncios_listar",
        "x-scope": "anuncios:ler",
        "x-read-only": true
      }
    },
    "/anuncios/opcoes": {
      "get": {
        "operationId": "anuncio_opcoes",
        "summary": "Opções de anúncio",
        "description": "Mostra se o plano permite montar campanha, quantos créditos restam, quanto custa um kit e os tipos de negócio, ofertas e formatos de anúncio disponíveis.",
        "tags": [
          "anuncios"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnuncioOpcoesResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "anuncio_opcoes",
        "x-scope": "anuncios:ler",
        "x-read-only": true
      }
    },
    "/anuncios/gerar": {
      "post": {
        "operationId": "anuncio_gerar",
        "summary": "Gerar kit de campanha",
        "description": "Monta um kit de campanha pra Facebook e Instagram (textos, imagens e público) com base no Cérebro da conta. Gasta créditos do plano a cada kit e não publica nada.",
        "tags": [
          "anuncios"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnuncioGerarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "anuncio_gerar",
        "x-scope": "anuncios:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "tipo_de_negocio": {
                    "type": "string",
                    "maxLength": 60,
                    "description": "Slug de anuncio_opcoes (tiposDeNegocio)."
                  },
                  "oferta": {
                    "type": "string",
                    "maxLength": 60,
                    "description": "Slug de uma oferta desse tipo de negócio."
                  },
                  "descricao": {
                    "type": "string",
                    "maxLength": 3000,
                    "description": "O que anunciar, em texto livre. Obrigatório quando não houver tipo_de_negocio."
                  },
                  "orcamento_mensal": {
                    "type": "number",
                    "minimum": 300,
                    "maximum": 10000,
                    "description": "Orçamento do mês em reais."
                  },
                  "formatos": {
                    "type": "array",
                    "maxItems": 3,
                    "items": {
                      "type": "string",
                      "maxLength": 60
                    },
                    "description": "Um slug de formato por criativo, na ordem (veja anuncio_opcoes)."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/anuncios/campanhas": {
      "get": {
        "operationId": "anuncios_campanhas",
        "summary": "Resultado das campanhas",
        "description": "Lista TODAS as campanhas da conta de anúncios da Meta conectada (inclusive as criadas direto no Gerenciador), com status, orçamento por dia, gasto, resultados (conversas, cadastros ou compras) e custo por resultado desde o começo de cada campanha. Mostra também o motivo de anúncio reprovado. Só leitura: não muda nada na Meta.",
        "tags": [
          "anuncios"
        ],
        "parameters": [
          {
            "name": "ativas",
            "in": "query",
            "required": false,
            "description": "Só campanhas rodando agora.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnunciosCampanhasResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "anuncios_campanhas",
        "x-scope": "anuncios:ler",
        "x-read-only": true
      }
    },
    "/anuncios/campanhas/{campanha_id}": {
      "get": {
        "operationId": "anuncio_relatorio",
        "summary": "Relatório de uma campanha",
        "description": "Relatório completo de uma campanha da Meta, lido ao vivo: gasto, resultados, custo por resultado, alcance, frequência, taxa de clique, custo por mil, o público, cada anúncio com texto, imagem e resultado próprio, e o gasto dia a dia. O `campanha_id` é o id da campanha na lista de campanhas. Só leitura.",
        "tags": [
          "anuncios"
        ],
        "parameters": [
          {
            "name": "campanha_id",
            "in": "path",
            "required": true,
            "description": "O `campanhaId` que anuncios_campanhas devolveu.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{1,40}$"
            }
          },
          {
            "name": "periodo",
            "in": "query",
            "required": false,
            "description": "Período das métricas. Padrão: tudo, desde o começo da campanha.",
            "schema": {
              "type": "string",
              "enum": [
                "tudo",
                "30dias",
                "7dias",
                "hoje"
              ]
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnuncioRelatorioResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "anuncio_relatorio",
        "x-scope": "anuncios:ler",
        "x-read-only": true
      }
    },
    "/anuncios/{kit_id}": {
      "get": {
        "operationId": "anuncios_listar_kit",
        "summary": "Listar kits de campanha (um kit pelo id)",
        "description": "Lista os kits de campanha já gerados, com o resultado dos que foram publicados. Com `kit_id`, devolve o kit inteiro.",
        "tags": [
          "anuncios"
        ],
        "parameters": [
          {
            "name": "kit_id",
            "in": "path",
            "required": true,
            "description": "Id de um kit, pra ver o conteúdo completo.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KitDeCampanha"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "anuncios_listar",
        "x-scope": "anuncios:ler",
        "x-read-only": true
      }
    },
    "/anuncios/{campanha_id}/pausar": {
      "post": {
        "operationId": "anuncio_pausar",
        "summary": "Pausar campanha",
        "description": "Pausa uma campanha da Meta que está rodando: ela para de entregar e de gastar na hora. O `campanhaId` é o id da campanha na lista de campanhas. Não tem como religar por aqui: quem retoma é o dono, no app.",
        "tags": [
          "anuncios"
        ],
        "parameters": [
          {
            "name": "campanha_id",
            "in": "path",
            "required": true,
            "description": "O `campanhaId` que anuncios_campanhas devolveu.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{1,40}$"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnuncioPausarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "anuncio_pausar",
        "x-scope": "anuncios:escrever",
        "x-read-only": false
      }
    },
    "/anuncios/{campanha_id}/orcamento": {
      "post": {
        "operationId": "anuncio_orcamento",
        "summary": "Mudar o orçamento de uma campanha",
        "description": "Muda quanto uma campanha da Meta gasta por dia, em reais. O valor é o TOTAL da campanha por dia: quando ela divide o dinheiro entre vários conjuntos, o total é repartido entre os que estão ligados, na proporção de hoje. Muda o gasto real da conta de anúncios. Valor alto ou salto grande volta pedindo `confirmar: true`.",
        "tags": [
          "anuncios"
        ],
        "parameters": [
          {
            "name": "campanha_id",
            "in": "path",
            "required": true,
            "description": "O `campanhaId` que anuncios_campanhas devolveu.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{1,40}$"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnuncioOrcamentoResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "anuncio_orcamento",
        "x-scope": "anuncios:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "orcamento_diario"
                ],
                "properties": {
                  "orcamento_diario": {
                    "type": "number",
                    "minimum": 5,
                    "maximum": 10000,
                    "description": "Novo total por dia da campanha, em reais."
                  },
                  "confirmar": {
                    "type": "boolean",
                    "description": "Só depois de o dono confirmar o valor que voltou em `precisaConfirmar`. Nunca mande junto na primeira tentativa."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/anuncios/{kit_id}/publicar": {
      "post": {
        "operationId": "anuncio_publicar_pausado",
        "summary": "Publicar campanha pausada",
        "description": "Cria a campanha de um kit na conta de anúncios da Meta do dono, SEMPRE PAUSADA: nada começa a rodar e nenhum centavo é gasto até o dono ativar no Gerenciador de Anúncios. Exige a conta da Meta conectada no app.",
        "tags": [
          "anuncios"
        ],
        "parameters": [
          {
            "name": "kit_id",
            "in": "path",
            "required": true,
            "description": "O kitId que anuncio_gerar ou anuncios_listar devolveu.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnuncioPublicarPausadoResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "anuncio_publicar_pausado",
        "x-scope": "anuncios:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "orcamento_diario"
                ],
                "properties": {
                  "orcamento_diario": {
                    "type": "number",
                    "minimum": 5,
                    "maximum": 10000,
                    "description": "Orçamento por dia em reais, quando o dono ativar."
                  },
                  "link": {
                    "type": "string",
                    "maxLength": 500,
                    "description": "Pra onde o anúncio leva. Sem link, leva pra página do Facebook."
                  },
                  "pagina_id": {
                    "type": "string",
                    "pattern": "^\\d{1,40}$",
                    "description": "Página do Facebook que assina. Padrão: a escolhida no app."
                  },
                  "conta_de_anuncios_id": {
                    "type": "string",
                    "pattern": "^(act_)?\\d{1,40}$",
                    "description": "Conta de anúncios. Padrão: a escolhida no app."
                  },
                  "categoria_especial": {
                    "type": "string",
                    "maxLength": 60,
                    "description": "Só quando o DONO disser que o anúncio é de crédito, emprego, moradia, política ou apostas."
                  },
                  "whatsapp": {
                    "type": "string",
                    "maxLength": 30,
                    "description": "Campanha de mensagens: o WhatsApp que o anúncio abre, com DDD. Padrão: o último confirmado ou o número conectado. A Meta confere se ele está ligado à Página antes de criar; se não estiver, nada é publicado e a resposta diz como ligar."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/site": {
      "get": {
        "operationId": "site_ler",
        "summary": "Ver o site",
        "description": "Mostra o site profissional da conta: se já existe, se está publicado, o endereço e o conteúdo das páginas. O texto completo dos artigos do blog não vem aqui.",
        "tags": [
          "site"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteLerResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "site_ler",
        "x-scope": "site:ler",
        "x-read-only": true
      }
    },
    "/site/criar": {
      "post": {
        "operationId": "site_criar",
        "summary": "Montar o site com IA",
        "description": "Monta o site da empresa com IA a partir do nome, do segmento e do Cérebro. Se a conta já tem site, ele é trocado inteiro (o anterior fica guardado em backup) e só roda com `substituir: true`. Pode gastar créditos.",
        "tags": [
          "site"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteCriarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "site_criar",
        "x-scope": "site:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "nome",
                  "segmento"
                ],
                "properties": {
                  "nome": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80,
                    "description": "Nome da empresa."
                  },
                  "segmento": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80,
                    "description": "O que a empresa faz, por exemplo \"clínica odontológica\"."
                  },
                  "cidade": {
                    "type": "string",
                    "maxLength": 60,
                    "description": "Cidade onde atende."
                  },
                  "whatsapp": {
                    "type": "string",
                    "maxLength": 20,
                    "description": "WhatsApp da empresa, com DDD."
                  },
                  "substituir": {
                    "type": "boolean",
                    "description": "true só quando o dono confirmou trocar o site que já existe."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/site/publicar": {
      "post": {
        "operationId": "site_publicar",
        "summary": "Publicar o site",
        "description": "Coloca o site no ar no endereço escolhido (letras minúsculas, números e hífen). Só funciona quando o plano inclui o site.",
        "tags": [
          "site"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SitePublicarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "site_publicar",
        "x-scope": "site:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "endereco"
                ],
                "properties": {
                  "endereco": {
                    "type": "string",
                    "pattern": "^[a-z0-9][a-z0-9-]{1,40}$",
                    "description": "O final do endereço, por exemplo \"clinica-sorriso\"."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/site/artigos": {
      "get": {
        "operationId": "site_artigos",
        "summary": "Artigos do blog do site",
        "description": "Lista os artigos do blog do site, do mais novo pro mais velho. Com `slug`, devolve o artigo inteiro.",
        "tags": [
          "site"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ArtigosDoSite"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "site_artigos",
        "x-scope": "site:ler",
        "x-read-only": true
      }
    },
    "/site/artigos/{slug}": {
      "get": {
        "operationId": "site_artigo_ler",
        "summary": "Artigos do blog do site (um artigo pelo slug)",
        "description": "Lista os artigos do blog do site, do mais novo pro mais velho. Com `slug`, devolve o artigo inteiro.",
        "tags": [
          "site"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "O slug de um artigo, pra ler o texto completo.",
            "schema": {
              "type": "string",
              "maxLength": 120
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ArtigoDoSite"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "site_artigos",
        "x-scope": "site:ler",
        "x-read-only": true
      }
    },
    "/google": {
      "get": {
        "operationId": "google_perfil",
        "summary": "Perfil do Google",
        "description": "Mostra se o perfil do negócio no Google (o do Google Maps) está conectado e qual é: nome, cidade, categoria e os links do Maps e de pedir avaliação. Se a conexão ainda não foi liberada pelo Google, diz isso. Só leitura.",
        "tags": [
          "google"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GooglePerfilResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "google_perfil",
        "x-scope": "google:ler",
        "x-read-only": true
      }
    },
    "/google/avaliacoes": {
      "get": {
        "operationId": "google_avaliacoes",
        "summary": "Avaliações do Google",
        "description": "Lista as avaliações mais recentes do perfil do negócio no Google, com a nota média, o total, cada avaliação (quem, estrelas, comentário, quando) e a resposta do negócio, se já tiver. Só leitura.",
        "tags": [
          "google"
        ],
        "parameters": [
          {
            "name": "sem_resposta",
            "in": "query",
            "required": false,
            "description": "Só as avaliações que o negócio ainda não respondeu.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GoogleAvaliacoesResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "google_avaliacoes",
        "x-scope": "google:ler",
        "x-read-only": true
      }
    },
    "/google/rascunho": {
      "post": {
        "operationId": "google_rascunho",
        "summary": "Rascunho para o Google",
        "description": "A IA escreve, com o que a conta ensinou sobre o negócio, um rascunho de resposta a uma avaliação (`tipo: resposta`, com a `avaliacao`) ou o post da semana do perfil (`tipo: post`, com `tema` opcional). Gasta créditos e NÃO publica: o rascunho só vai pro Google quando é publicado à parte.",
        "tags": [
          "google"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GoogleRascunhoResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "google_rascunho",
        "x-scope": "google:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "tipo"
                ],
                "properties": {
                  "tipo": {
                    "type": "string",
                    "enum": [
                      "resposta",
                      "post"
                    ]
                  },
                  "avaliacao": {
                    "type": "string",
                    "pattern": "^accounts/[^/]{1,80}/locations/[^/]{1,80}/reviews/[^/]{1,200}$",
                    "description": "O `avaliacao` de google_avaliacoes. Obrigatório pra resposta."
                  },
                  "tema": {
                    "type": "string",
                    "maxLength": 200,
                    "description": "Do que o post fala, por exemplo \"horário de feriado\". Opcional."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/google/publicar": {
      "post": {
        "operationId": "google_publicar",
        "summary": "Publicar no Google",
        "description": "PUBLICA no perfil do Google, visível pra qualquer pessoa: a resposta a uma avaliação (`tipo: resposta`, com `avaliacao` e `texto`; troca a resposta anterior, se houver) ou um post do perfil (`tipo: post`, com `texto`). Só com o texto EXATO que o dono leu e aprovou nesta conversa.",
        "tags": [
          "google"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GooglePublicarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "google_publicar",
        "x-scope": "google:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "tipo",
                  "texto"
                ],
                "properties": {
                  "tipo": {
                    "type": "string",
                    "enum": [
                      "resposta",
                      "post"
                    ]
                  },
                  "avaliacao": {
                    "type": "string",
                    "pattern": "^accounts/[^/]{1,80}/locations/[^/]{1,80}/reviews/[^/]{1,200}$",
                    "description": "O `avaliacao` de google_avaliacoes. Obrigatório pra resposta."
                  },
                  "texto": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 4000,
                    "description": "O texto que o dono aprovou, sem mudar nada."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/google/concorrentes": {
      "get": {
        "operationId": "google_concorrentes",
        "summary": "Concorrentes no Google Maps",
        "description": "Mostra quem aparece no Google Maps quando o cliente busca o serviço na cidade do negócio, com nota e número de avaliações de cada concorrente, e em que posição o negócio aparece em cada busca. Sem `palavras`, usa as que o dono já cadastrou no Ranquear. Só leitura.",
        "tags": [
          "google"
        ],
        "parameters": [
          {
            "name": "palavras",
            "in": "query",
            "required": false,
            "description": "O que o cliente digita, por exemplo \"dentista\" ou \"pizzaria\". Até 3. Separe os itens por vírgula.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GoogleConcorrentesResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "google_concorrentes",
        "x-scope": "google:ler",
        "x-read-only": true
      }
    },
    "/parceiro/clientes": {
      "get": {
        "operationId": "parceiro_clientes",
        "summary": "Clientes do parceiro",
        "description": "Para PARCEIRO (revenda): lista os seus clientes, com o `conta` de cada um, o nome do negócio, se o WhatsApp está conectado, o plano e até quando vale a licença. Passe esse `conta` em qualquer outra ferramenta pra agir na conta do cliente. Quem não é parceiro recebe `nao_parceiro`. Só leitura.",
        "tags": [
          "parceiro"
        ],
        "parameters": [
          {
            "name": "busca",
            "in": "query",
            "required": false,
            "description": "Parte do nome do negócio ou do e-mail.",
            "schema": {
              "type": "string",
              "maxLength": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ParceiroClientesResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "parceiro_clientes",
        "x-scope": "parceiro:ler",
        "x-read-only": true
      }
    },
    "/crm": {
      "post": {
        "operationId": "crm_alterar",
        "summary": "Mudar o CRM",
        "description": "Faz até 20 mudanças no CRM de uma vez: criar ou atualizar contato, criar negócio (cria o contato junto se não existir), mudar etapa, valor, título ou campos de um negócio, criar ou concluir tarefa, e anotar em contato ou negócio. Mover de etapa grava o mesmo carimbo de arrastar o card, então a régua de mensagens da etapa, se a conta tiver uma, vale igual. Nada é apagado. Se qualquer operação não puder ser feita, nenhuma é feita e a resposta diz o motivo.",
        "tags": [
          "crm"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrmAlterarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "crm_alterar",
        "x-scope": "crm:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "operacoes"
                ],
                "properties": {
                  "operacoes": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 20,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "acao"
                      ],
                      "properties": {
                        "acao": {
                          "type": "string",
                          "enum": [
                            "criar_contato",
                            "atualizar_contato",
                            "criar_negocio",
                            "atualizar_negocio",
                            "criar_tarefa",
                            "concluir_tarefa",
                            "anotar"
                          ],
                          "description": "O que fazer."
                        },
                        "id": {
                          "type": "string",
                          "pattern": "^[A-Za-z0-9_-]{1,64}$",
                          "description": "Id do contato, negócio ou tarefa (de crm_contatos, crm_funil ou crm_tarefas). Obrigatório pra atualizar, concluir e anotar."
                        },
                        "nome": {
                          "type": "string",
                          "maxLength": 120,
                          "description": "Nome do contato."
                        },
                        "telefone": {
                          "type": "string",
                          "maxLength": 30
                        },
                        "email": {
                          "type": "string",
                          "maxLength": 200
                        },
                        "empresa": {
                          "type": "string",
                          "maxLength": 120
                        },
                        "titulo": {
                          "type": "string",
                          "maxLength": 160,
                          "description": "Título do negócio ou da tarefa."
                        },
                        "valor": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 100000000,
                          "description": "Valor do negócio em reais."
                        },
                        "etapa": {
                          "type": "string",
                          "maxLength": 60,
                          "description": "O `etapaId` de crm_funil."
                        },
                        "contato": {
                          "type": "string",
                          "maxLength": 120,
                          "description": "Nome do contato do negócio ou da tarefa."
                        },
                        "prazo": {
                          "type": "string",
                          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                          "description": "Prazo da tarefa, YYYY-MM-DD."
                        },
                        "nota": {
                          "type": "string",
                          "maxLength": 2000,
                          "description": "Texto da nota."
                        },
                        "nota_em": {
                          "type": "string",
                          "enum": [
                            "contato",
                            "negocio"
                          ],
                          "description": "Onde fica a nota de `anotar`. Padrão contato."
                        },
                        "campos": {
                          "type": "object",
                          "description": "Campos do funil do negócio: {\"id do campo\": \"valor\"}. Ids em crm_funil."
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/crm/funil": {
      "get": {
        "operationId": "crm_funil",
        "summary": "Ver o funil de vendas",
        "description": "Mostra o funil de vendas do CRM: cada etapa com quantos negócios e quanto somam, e os negócios (cliente, valor, etapa, há quanto tempo parado, campos e últimas notas). Filtra por etapa e por palavra. Traz também os ids das etapas e dos campos do funil. Só leitura.",
        "tags": [
          "crm"
        ],
        "parameters": [
          {
            "name": "etapa",
            "in": "query",
            "required": false,
            "description": "Só negócios desta etapa (o `etapaId`).",
            "schema": {
              "type": "string",
              "maxLength": 60
            }
          },
          {
            "name": "busca",
            "in": "query",
            "required": false,
            "description": "Palavra no título, no cliente, no telefone ou nas notas.",
            "schema": {
              "type": "string",
              "maxLength": 100
            }
          },
          {
            "name": "parados",
            "in": "query",
            "required": false,
            "description": "Só negócios sem mudar de etapa há pelo menos tantos dias.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 365
            }
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantos negócios devolver, do mais recente pro mais antigo. Padrão 50; 0 devolve só o resumo das etapas.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 200
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrmFunilResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "crm_funil",
        "x-scope": "crm:ler",
        "x-read-only": true
      }
    },
    "/crm/contatos": {
      "get": {
        "operationId": "crm_contatos",
        "summary": "Procurar contatos",
        "description": "Procura contatos do CRM por nome, telefone, e-mail ou empresa, com quantos negócios cada um tem. Sem busca, lista os mais recentes. Só leitura.",
        "tags": [
          "crm"
        ],
        "parameters": [
          {
            "name": "busca",
            "in": "query",
            "required": false,
            "description": "Nome, telefone (só números serve), e-mail ou empresa.",
            "schema": {
              "type": "string",
              "maxLength": 100
            }
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantos contatos devolver. Padrão 30.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrmContatosResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "crm_contatos",
        "x-scope": "crm:ler",
        "x-read-only": true
      }
    },
    "/crm/tarefas": {
      "get": {
        "operationId": "crm_tarefas",
        "summary": "Ver tarefas",
        "description": "Lista as tarefas abertas do CRM, com as atrasadas e as de hoje primeiro (dia de Brasília). Só leitura.",
        "tags": [
          "crm"
        ],
        "parameters": [
          {
            "name": "quais",
            "in": "query",
            "required": false,
            "description": "Padrão todas as abertas.",
            "schema": {
              "type": "string",
              "enum": [
                "todas",
                "atrasadas",
                "hoje",
                "sem_prazo"
              ]
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrmTarefasResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "crm_tarefas",
        "x-scope": "crm:ler",
        "x-read-only": true
      }
    },
    "/ligacoes": {
      "get": {
        "operationId": "ligacoes_listar",
        "summary": "Listar ligações",
        "description": "Lista as ligações da conta, da mais nova pra mais velha: as que o atendente de voz atendeu e as que a equipe fez pelo discador. Cada uma vem com quem ligou, quanto durou, o motivo, o resumo, o que foi anotado e se pediu retorno. A transcrição inteira não vem na lista. Só leitura.",
        "tags": [
          "ligacoes"
        ],
        "parameters": [
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantas ligações devolver. Padrão 30.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "retorno",
            "in": "query",
            "required": false,
            "description": "Só as ligações em que a pessoa pediu pra falar com alguém da equipe.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "tipo",
            "in": "query",
            "required": false,
            "description": "atendente = atendidas ou feitas pelo atendente de voz; equipe = feitas por uma pessoa pelo discador.",
            "schema": {
              "type": "string",
              "enum": [
                "atendente",
                "equipe"
              ]
            }
          },
          {
            "name": "busca",
            "in": "query",
            "required": false,
            "description": "Palavra no nome, no telefone, no motivo ou no resumo.",
            "schema": {
              "type": "string",
              "maxLength": 100
            }
          },
          {
            "name": "de",
            "in": "query",
            "required": false,
            "description": "Só ligações a partir deste dia, YYYY-MM-DD.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LigacoesListarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "ligacoes_listar",
        "x-scope": "ligacoes:ler",
        "x-read-only": true
      }
    },
    "/ligacoes/{id}": {
      "get": {
        "operationId": "ligacao_ler",
        "summary": "Ler uma ligação",
        "description": "Uma ligação inteira: resumo, o que foi anotado, as correções que o dono fez e a transcrição, fala por fala. O `id` é o da ligação na lista de ligações. Só leitura.",
        "tags": [
          "ligacoes"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "O `id` que ligacoes_listar devolveu.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,80}$"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LigacaoLerResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "ligacao_ler",
        "x-scope": "ligacoes:ler",
        "x-read-only": true
      }
    },
    "/estoque": {
      "get": {
        "operationId": "erp_estoque",
        "summary": "Ver o estoque",
        "description": "Mostra o estoque: saldo de cada produto controlado, o mínimo, o que acabou ou está acabando, custo, preço, margem, quanto vale a mercadoria parada e o custo do que foi vendido no mês. Valores em reais. Só leitura.",
        "tags": [
          "erp"
        ],
        "parameters": [
          {
            "name": "busca",
            "in": "query",
            "required": false,
            "description": "Palavra no nome ou no código do produto.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          },
          {
            "name": "alertas",
            "in": "query",
            "required": false,
            "description": "Só o que acabou, está acabando ou ficou negativo.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "movimentos",
            "in": "query",
            "required": false,
            "description": "Inclui as últimas entradas e saídas (até 30).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErpEstoqueResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "erp_estoque",
        "x-scope": "erp:ler",
        "x-read-only": true
      }
    },
    "/estoque/movimentos": {
      "post": {
        "operationId": "erp_estoque_movimentar",
        "summary": "Lançar entrada ou saída de estoque",
        "description": "Lança UM movimento de estoque e move o saldo junto: compra ou devolução (entra), venda ou perda (sai), ajuste de contagem (entra ou sai) ou carga inicial. `quantidade` positiva entra e negativa sai, e precisa bater com o motivo. Fica no extrato. Precisa do complemento ERP.",
        "tags": [
          "erp"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErpEstoqueMovimentarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "erp_estoque_movimentar",
        "x-scope": "erp:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "produto_id",
                  "quantidade",
                  "motivo"
                ],
                "properties": {
                  "produto_id": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9_-]{1,64}$",
                    "description": "O `produtoId` de erp_estoque."
                  },
                  "quantidade": {
                    "type": "number",
                    "minimum": -100000,
                    "maximum": 100000,
                    "description": "Positiva entra, negativa sai, na unidade do produto. Não pode ser zero."
                  },
                  "motivo": {
                    "type": "string",
                    "enum": [
                      "compra",
                      "venda",
                      "perda",
                      "devolucao",
                      "ajuste",
                      "inicial"
                    ],
                    "description": "compra, devolucao e inicial entram; venda e perda saem; ajuste é correção de contagem nos dois sentidos."
                  },
                  "custo_unitario": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1000000,
                    "description": "Em reais, quanto custou UMA unidade nesta compra. Só vale em entrada."
                  },
                  "observacao": {
                    "type": "string",
                    "maxLength": 300,
                    "description": "Nota curta, por exemplo o número da nota do fornecedor."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/caixa": {
      "get": {
        "operationId": "erp_caixa",
        "summary": "Ver o caixa do mês",
        "description": "Mostra o caixa de um mês: o que entrou e saiu (pago), o que ainda vai entrar e sair (previsto), o resultado (entradas pagas menos saídas pagas menos o custo da mercadoria vendida), gasto por categoria, comissão de cada profissional e os lançamentos. Sem `mes`, o mês atual. Valores em reais. Só leitura.",
        "tags": [
          "erp"
        ],
        "parameters": [
          {
            "name": "mes",
            "in": "query",
            "required": false,
            "description": "Mês no formato YYYY-MM. Padrão: o mês atual.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-(0[1-9]|1[0-2])$"
            }
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantos lançamentos devolver, do mais novo pro mais velho. Padrão 50; 0 devolve só os totais.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 500
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErpCaixaResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "erp_caixa",
        "x-scope": "erp:ler",
        "x-read-only": true
      },
      "post": {
        "operationId": "erp_caixa_lancar",
        "summary": "Lançar no caixa",
        "description": "Cria um lançamento no caixa (entrada ou saída, já paga ou prevista) ou corrige um existente pelo `id`. Valor em reais.",
        "tags": [
          "erp"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErpCaixaLancarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "erp_caixa_lancar",
        "x-scope": "erp:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "tipo",
                  "valor",
                  "descricao",
                  "dia"
                ],
                "properties": {
                  "tipo": {
                    "type": "string",
                    "enum": [
                      "entrada",
                      "saida"
                    ],
                    "description": "entrada = dinheiro que entrou; saida = dinheiro que saiu."
                  },
                  "valor": {
                    "type": "number",
                    "minimum": 0.01,
                    "maximum": 10000000,
                    "description": "Em reais, sempre positivo. O tipo diz se entra ou sai."
                  },
                  "descricao": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 140,
                    "description": "O que foi, por exemplo \"Aluguel de setembro\"."
                  },
                  "dia": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "Dia do caixa, YYYY-MM-DD."
                  },
                  "situacao": {
                    "type": "string",
                    "enum": [
                      "pago",
                      "previsto"
                    ],
                    "description": "pago (padrão) já aconteceu; previsto é conta a pagar ou a receber."
                  },
                  "categoria": {
                    "type": "string",
                    "maxLength": 60,
                    "description": "Por exemplo \"Aluguel\", \"Fornecedor\" ou \"Serviço\". As categorias já usadas aparecem no caixa."
                  },
                  "forma": {
                    "type": "string",
                    "maxLength": 30,
                    "description": "pix, dinheiro, debito, credito ou outra."
                  },
                  "observacao": {
                    "type": "string",
                    "maxLength": 300
                  },
                  "id": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9_-]{1,64}$",
                    "description": "Id de um lançamento de erp_caixa, pra corrigir. Sem id, cria um novo."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/caixa/resultado": {
      "get": {
        "operationId": "erp_resultado",
        "summary": "Resultado do negócio (DRE)",
        "description": "O demonstrativo de resultado do mês (receita, custos, despesas e lucro, pelo plano de contas da conta), a comparação com os meses anteriores e a projeção do saldo até o fim do mês. Mostra também as categorias que ainda não foram classificadas. Valores em reais. Só leitura.",
        "tags": [
          "erp"
        ],
        "parameters": [
          {
            "name": "mes",
            "in": "query",
            "required": false,
            "description": "Mês do demonstrativo, YYYY-MM. Padrão: o mês atual.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-(0[1-9]|1[0-2])$"
            }
          },
          {
            "name": "meses",
            "in": "query",
            "required": false,
            "description": "Quantos meses na comparação. Padrão 6.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 24
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErpResultadoResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "erp_resultado",
        "x-scope": "erp:ler",
        "x-read-only": true
      }
    },
    "/agenda": {
      "get": {
        "operationId": "agenda_listar",
        "summary": "Ver a agenda",
        "description": "Lista os horários marcados (pela IA do WhatsApp, pelo link de agendamento ou pela empresa) e os bloqueios da agenda, num intervalo de datas. Sem datas, mostra de hoje até daqui a 7 dias. Os pendentes esperam o dono confirmar. Só leitura.",
        "tags": [
          "agenda"
        ],
        "parameters": [
          {
            "name": "de",
            "in": "query",
            "required": false,
            "description": "Primeiro dia, YYYY-MM-DD. Padrão: hoje.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "ate",
            "in": "query",
            "required": false,
            "description": "Último dia, YYYY-MM-DD, incluído. Padrão: 7 dias depois de `de`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "Só agendamentos com este status.",
            "schema": {
              "type": "string",
              "enum": [
                "pendente",
                "confirmado",
                "cancelado",
                "realizado"
              ]
            }
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantos agendamentos devolver. Padrão 50.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgendaListarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "agenda_listar",
        "x-scope": "agenda:ler",
        "x-read-only": true
      },
      "post": {
        "operationId": "agenda_marcar",
        "summary": "Marcar um horário",
        "description": "Marca um horário na agenda, já confirmado (entra nos lembretes automáticos e na agenda conectada do Google ou Outlook). Recusa horário que bate com outro agendamento ou com um bloqueio. Não avisa o cliente.",
        "tags": [
          "agenda"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgendaMarcarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "agenda_marcar",
        "x-scope": "agenda:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "nome",
                  "inicio"
                ],
                "properties": {
                  "nome": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80,
                    "description": "Nome do cliente."
                  },
                  "inicio": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$",
                    "description": "Dia e hora no horário da empresa: YYYY-MM-DDTHH:MM."
                  },
                  "telefone": {
                    "type": "string",
                    "maxLength": 20,
                    "description": "WhatsApp do cliente com DDD. Sem ele, o cliente não recebe lembrete."
                  },
                  "servico": {
                    "type": "string",
                    "maxLength": 80,
                    "description": "O que vai ser feito, por exemplo \"Consulta\" ou \"Corte\"."
                  },
                  "duracao_min": {
                    "type": "integer",
                    "minimum": 5,
                    "maximum": 600,
                    "description": "Duração em minutos. Padrão 60."
                  },
                  "endereco": {
                    "type": "string",
                    "maxLength": 300,
                    "description": "Onde é o atendimento, quando não é no endereço da empresa."
                  },
                  "ignorar_conflito": {
                    "type": "boolean",
                    "description": "true só quando o dono confirmou marcar em cima de outro horário ou bloqueio."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/agenda/bloqueios": {
      "post": {
        "operationId": "agenda_bloquear",
        "summary": "Bloquear ou liberar horário",
        "description": "Bloqueia um período da agenda (almoço, folga, feriado, férias) para a IA e o link de agendamento não marcarem nada nele, ou tira um bloqueio (acao \"remover\" com o bloqueio_id que aparece na agenda). Não mexe em quem já está marcado.",
        "tags": [
          "agenda"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BloqueioCriado"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "agenda_bloquear",
        "x-scope": "agenda:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "dia": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "Dia do bloqueio, YYYY-MM-DD. Obrigatório pra bloquear."
                  },
                  "das": {
                    "type": "string",
                    "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                    "description": "Começa às, HH:MM. Obrigatório pra bloquear."
                  },
                  "ate": {
                    "type": "string",
                    "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                    "description": "Termina às, HH:MM. Obrigatório pra bloquear."
                  },
                  "motivo": {
                    "type": "string",
                    "maxLength": 120,
                    "description": "Por exemplo \"Almoço\" ou \"Feriado\"."
                  },
                  "bloqueio_id": {
                    "type": "string",
                    "maxLength": 80,
                    "description": "O `id` do bloqueio, pra remover."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/agenda/bloqueios/{bloqueio_id}": {
      "delete": {
        "operationId": "agenda_bloqueio_remover",
        "summary": "Bloquear ou liberar horário (remove um bloqueio)",
        "description": "Bloqueia um período da agenda (almoço, folga, feriado, férias) para a IA e o link de agendamento não marcarem nada nele, ou tira um bloqueio (acao \"remover\" com o bloqueio_id que aparece na agenda). Não mexe em quem já está marcado.",
        "tags": [
          "agenda"
        ],
        "parameters": [
          {
            "name": "bloqueio_id",
            "in": "path",
            "required": true,
            "description": "O `id` do bloqueio, pra remover.",
            "schema": {
              "type": "string",
              "maxLength": 80
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BloqueioRemovido"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "agenda_bloquear",
        "x-scope": "agenda:escrever",
        "x-read-only": false
      }
    },
    "/agenda/{id}/remarcar": {
      "post": {
        "operationId": "agenda_remarcar",
        "summary": "Remarcar um horário",
        "description": "Muda o dia e a hora de um agendamento (e a duração, se mandar). O horário fica confirmado e os lembretes recomeçam. Recusa horário ocupado. Não avisa o cliente.",
        "tags": [
          "agenda"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "O `id` que agenda_listar devolveu.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgendaRemarcarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "agenda_remarcar",
        "x-scope": "agenda:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "inicio"
                ],
                "properties": {
                  "inicio": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$",
                    "description": "Novo dia e hora: YYYY-MM-DDTHH:MM."
                  },
                  "duracao_min": {
                    "type": "integer",
                    "minimum": 5,
                    "maximum": 600,
                    "description": "Nova duração em minutos. Sem ela, fica a atual."
                  },
                  "ignorar_conflito": {
                    "type": "boolean",
                    "description": "true só quando o dono confirmou remarcar em cima de outro horário ou bloqueio."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/agenda/{id}/confirmar": {
      "post": {
        "operationId": "agenda_confirmar",
        "summary": "Confirmar um horário pendente",
        "description": "Confirma um horário que a IA deixou pendente (quando ela não marca sozinha). Confirmado, ele entra nos lembretes automáticos. Não avisa o cliente.",
        "tags": [
          "agenda"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "O `id` que agenda_listar devolveu.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgendaConfirmarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "agenda_confirmar",
        "x-scope": "agenda:escrever",
        "x-read-only": false
      }
    },
    "/agenda/{id}/cancelar": {
      "post": {
        "operationId": "agenda_cancelar",
        "summary": "Cancelar um horário",
        "description": "Cancela um agendamento e libera o horário. Não avisa o cliente: quem avisa é o dono, pelo app.",
        "tags": [
          "agenda"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "O `id` que agenda_listar devolveu.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgendaCancelarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "agenda_cancelar",
        "x-scope": "agenda:escrever",
        "x-read-only": false
      }
    },
    "/pedidos": {
      "get": {
        "operationId": "pedidos_listar",
        "summary": "Listar pedidos e OS",
        "description": "Lista os pedidos, ordens de serviço e orçamentos da conta, do mais novo pro mais velho, com cliente, etapa, total, itens e se já foi pago. Traz também as etapas do quadro (com o `etapaId` de cada uma) e quantos pedidos há em cada. Valores em reais. Só leitura.",
        "tags": [
          "erp"
        ],
        "parameters": [
          {
            "name": "busca",
            "in": "query",
            "required": false,
            "description": "Nome ou telefone do cliente, número do pedido ou palavra nos itens.",
            "schema": {
              "type": "string",
              "maxLength": 100
            }
          },
          {
            "name": "etapa",
            "in": "query",
            "required": false,
            "description": "Só pedidos nesta etapa (o `etapaId`).",
            "schema": {
              "type": "string",
              "maxLength": 60
            }
          },
          {
            "name": "abertos",
            "in": "query",
            "required": false,
            "description": "Só o que ainda não foi entregue nem cancelado.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "tipo",
            "in": "query",
            "required": false,
            "description": "Só pedidos, só ordens de serviço ou só orçamentos.",
            "schema": {
              "type": "string",
              "enum": [
                "pedido",
                "os",
                "orcamento"
              ]
            }
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantos pedidos devolver. Padrão 30.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PedidosListarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "pedidos_listar",
        "x-scope": "erp:ler",
        "x-read-only": true
      },
      "post": {
        "operationId": "pedido_criar",
        "summary": "Criar pedido ou OS",
        "description": "Cria um pedido, ordem de serviço ou orçamento com cliente e itens (produto, peça ou serviço, com preço em reais), na primeira etapa do quadro. Não avisa o cliente nem gera link: quem manda é o dono, pelo app. Se a primeira etapa é a que baixa estoque, o estoque baixa junto. Grava na conta: só com a confirmação do dono. Precisa do complemento ERP.",
        "tags": [
          "erp"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PedidoCriarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "pedido_criar",
        "x-scope": "erp:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "cliente_nome": {
                    "type": "string",
                    "maxLength": 120,
                    "description": "Nome do cliente."
                  },
                  "cliente_telefone": {
                    "type": "string",
                    "maxLength": 20,
                    "description": "WhatsApp do cliente com DDD. Precisa do nome ou do telefone."
                  },
                  "contato_id": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9_-]{1,128}$",
                    "description": "O `id` do contato em crm_contatos, quando o cliente já está no CRM."
                  },
                  "tipo": {
                    "type": "string",
                    "enum": [
                      "pedido",
                      "os",
                      "orcamento"
                    ],
                    "description": "pedido (venda, entrega), os (serviço, conserto) ou orcamento (esperando o cliente aprovar). Padrão: o do jeito de operar da conta."
                  },
                  "itens": {
                    "type": "array",
                    "maxItems": 80,
                    "description": "O que foi pedido ou orçado.",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "descricao"
                      ],
                      "properties": {
                        "descricao": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 160,
                          "description": "O item como o cliente lê, por exemplo \"Troca de óleo\" ou \"Botijão P13\"."
                        },
                        "quantidade": {
                          "type": "number",
                          "minimum": 0.001,
                          "maximum": 100000,
                          "description": "Quantidade. Padrão 1."
                        },
                        "preco": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 10000000,
                          "description": "Preço de UMA unidade, em reais."
                        },
                        "tipo": {
                          "type": "string",
                          "enum": [
                            "produto",
                            "peca",
                            "servico"
                          ],
                          "description": "produto e peca mexem no estoque (com `produto_id`); servico é mão de obra. Padrão produto."
                        },
                        "produto_id": {
                          "type": "string",
                          "pattern": "^[A-Za-z0-9_-]{1,128}$",
                          "description": "O `produtoId` de erp_estoque, pra baixar o estoque certo. Sem ele, o item não mexe no estoque."
                        },
                        "desconto": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 10000000,
                          "description": "Desconto na linha inteira, em reais."
                        }
                      }
                    }
                  },
                  "desconto": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 10000000,
                    "description": "Desconto no pedido inteiro, em reais, além do de cada item."
                  },
                  "taxa": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 10000000,
                    "description": "Taxa de entrega ou de deslocamento, em reais."
                  },
                  "endereco": {
                    "type": "string",
                    "maxLength": 300,
                    "description": "Endereço de entrega ou do serviço."
                  },
                  "forma_pagamento": {
                    "type": "string",
                    "maxLength": 60,
                    "description": "Como o cliente vai pagar, por exemplo \"pix\" ou \"dinheiro\"."
                  },
                  "previsao": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2})?$",
                    "description": "Previsão de pronto ou de entrega: YYYY-MM-DD ou YYYY-MM-DDTHH:MM."
                  },
                  "observacao_cliente": {
                    "type": "string",
                    "maxLength": 1000,
                    "description": "O que o cliente lê na aprovação e no acompanhamento."
                  },
                  "notas": {
                    "type": "string",
                    "maxLength": 1000,
                    "description": "Anotação interna. Nunca vai pro cliente."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/pedidos/{id}": {
      "get": {
        "operationId": "pedido_ler",
        "summary": "Ler um pedido ou OS",
        "description": "Um pedido, OS ou orçamento inteiro, pelo `id` ou pelo número: itens com preço e desconto, totais, etapa, cliente, endereço, previsão, a aprovação do cliente, a cobrança ligada, os links de aprovação e de acompanhamento (quando o dono já gerou) e o histórico. Valores em reais. Só leitura.",
        "tags": [
          "erp"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "O `id` que pedidos_listar devolveu.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,128}$"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PedidoLerResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "pedido_ler",
        "x-scope": "erp:ler",
        "x-read-only": true
      }
    },
    "/pedidos/{id}/etapa": {
      "post": {
        "operationId": "pedido_mudar_etapa",
        "summary": "Mudar a etapa de um pedido",
        "description": "Move um pedido ou OS para outra etapa do quadro (por exemplo de \"Em execução\" para \"Pronto\"), pelo `etapaId`. Fica no histórico. Conforme o ajuste da conta, a etapa nova baixa ou devolve o estoque. Não manda mensagem: o cliente só vê a etapa nova se abrir o link de acompanhamento. Grava na conta: só com a confirmação do dono. Precisa do complemento ERP.",
        "tags": [
          "erp"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "O `id` que pedidos_listar devolveu.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,128}$"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PedidoMudarEtapaResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "pedido_mudar_etapa",
        "x-scope": "erp:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "etapa"
                ],
                "properties": {
                  "etapa": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 60,
                    "description": "O `etapaId` da etapa nova, da lista `etapas` de pedidos_listar."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/cobrancas": {
      "get": {
        "operationId": "cobrancas_listar",
        "summary": "Listar cobranças",
        "description": "Lista as cobranças da conta (Pix, boleto, cartão ou link de pagamento), da mais nova pra mais velha, com cliente, valor, vencimento, situação (pendente, paga, vencida, estornada, cancelada), o link de pagamento e se já foi mandada ao cliente. Diz também se a conta de cobrança está aberta e aprovada. Valores em reais. Só leitura.",
        "tags": [
          "cobrancas"
        ],
        "parameters": [
          {
            "name": "situacao",
            "in": "query",
            "required": false,
            "description": "Só cobranças nesta situação.",
            "schema": {
              "type": "string",
              "enum": [
                "pendente",
                "paga",
                "vencida",
                "estornada",
                "cancelada"
              ]
            }
          },
          {
            "name": "busca",
            "in": "query",
            "required": false,
            "description": "Nome ou telefone do cliente, ou palavra na descrição.",
            "schema": {
              "type": "string",
              "maxLength": 100
            }
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantas cobranças devolver. Padrão 50.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CobrancasListarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "cobrancas_listar",
        "x-scope": "cobrancas:ler",
        "x-read-only": true
      },
      "post": {
        "operationId": "cobranca_criar",
        "summary": "Criar cobrança",
        "description": "Cria UMA cobrança (link de pagamento, Pix, boleto ou cartão) na conta de cobrança da conta e devolve o link e o Pix copia e cola. NÃO manda nada ao cliente: o dono manda o link pelo WhatsApp ou pela tela de Cobranças. Com `pedido_id`, cobra o total do pedido e liga a cobrança a ele: quando o cliente paga, o pedido fica pago sozinho. A mesma cobrança pedida de novo (mesmo pedido, ou mesmo cliente, valor, descrição e vencimento) devolve a que já existe em vez de criar outra. Não move dinheiro. Grava na conta: só com a confirmação do dono.",
        "tags": [
          "cobrancas"
        ],
        "parameters": [
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CobrancaCriarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "409": {
            "$ref": "#/components/responses/Erro409"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "cobranca_criar",
        "x-scope": "cobrancas:escrever",
        "x-read-only": false,
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "pedido_id": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9_-]{1,128}$",
                    "description": "O `id` de um pedido de pedidos_listar. Cobra o total dele, no nome do cliente dele."
                  },
                  "valor": {
                    "type": "number",
                    "minimum": 5,
                    "maximum": 100000,
                    "description": "Em reais, de 5 a 100.000. Obrigatório sem `pedido_id`."
                  },
                  "descricao": {
                    "type": "string",
                    "maxLength": 140,
                    "description": "O que está sendo cobrado, como o cliente lê. Obrigatória sem `pedido_id`."
                  },
                  "vencimento": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "Dia do vencimento, YYYY-MM-DD. Padrão: hoje."
                  },
                  "metodo": {
                    "type": "string",
                    "enum": [
                      "link",
                      "pix",
                      "boleto",
                      "cartao"
                    ],
                    "description": "link (o cliente escolhe como pagar, padrão), pix, boleto (precisa de CPF ou CNPJ) ou cartao."
                  },
                  "cliente_nome": {
                    "type": "string",
                    "maxLength": 80,
                    "description": "Nome do cliente."
                  },
                  "cliente_telefone": {
                    "type": "string",
                    "maxLength": 20,
                    "description": "WhatsApp do cliente com DDD. Precisa do nome ou do telefone."
                  },
                  "contato_id": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9_-]{1,128}$",
                    "description": "O `id` do contato em crm_contatos, quando o cliente já está no CRM."
                  },
                  "cpf_cnpj": {
                    "type": "string",
                    "maxLength": 20,
                    "description": "CPF ou CNPJ de quem paga. Obrigatório pro boleto."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/retornos": {
      "get": {
        "operationId": "retornos_listar",
        "summary": "Listar retornos",
        "description": "Lista os retornos (lembretes pro cliente voltar: vacina, limpeza de 6 meses, troca de óleo, gás acabando, cliente sumido) que os roteiros ligados criaram: quem, por quê, quando sai, se já saiu, se o cliente respondeu, agendou ou voltou, e a receita que voltou. Os pendentes saem sozinhos pela rotina da conta, dentro das travas de horário, opt-out e teto por dia. Valores em reais. Só leitura.",
        "tags": [
          "crm"
        ],
        "parameters": [
          {
            "name": "situacao",
            "in": "query",
            "required": false,
            "description": "Só retornos nesta situação.",
            "schema": {
              "type": "string",
              "enum": [
                "pendente",
                "enviado",
                "agendado",
                "convertido",
                "dispensado"
              ]
            }
          },
          {
            "name": "roteiro",
            "in": "query",
            "required": false,
            "description": "Só retornos deste roteiro (o `id` de retorno_roteiros).",
            "schema": {
              "type": "string",
              "maxLength": 60
            }
          },
          {
            "name": "busca",
            "in": "query",
            "required": false,
            "description": "Nome ou telefone do cliente.",
            "schema": {
              "type": "string",
              "maxLength": 100
            }
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantos retornos devolver. Padrão 50.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RetornosListarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "retornos_listar",
        "x-scope": "crm:ler",
        "x-read-only": true
      }
    },
    "/retornos/roteiros": {
      "get": {
        "operationId": "retorno_roteiros",
        "summary": "Roteiros de retorno",
        "description": "Lista os roteiros prontos de retorno por nicho (veterinária, clínica, oficina, gás e água, imobiliária e geral), com o que cada um faz, o intervalo, a mensagem e se está ligado nesta conta, e os recomendados pro nicho da conta. Com `roteiro_id`, mostra a prévia: quantos clientes seriam lembrados nos próximos 7 dias se o roteiro fosse ligado, alguns exemplos e a mensagem pronta. Não liga nada: ligar um roteiro faz a conta lembrar clientes sozinha, e isso é com o dono, no app. Só leitura.",
        "tags": [
          "crm"
        ],
        "parameters": [
          {
            "name": "nicho",
            "in": "query",
            "required": false,
            "description": "Só os roteiros deste nicho.",
            "schema": {
              "type": "string",
              "enum": [
                "vet",
                "clinica",
                "auto",
                "gas",
                "imobiliaria",
                "geral"
              ]
            }
          },
          {
            "name": "ligados",
            "in": "query",
            "required": false,
            "description": "Só os roteiros ligados nesta conta.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RetornoRoteirosResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "retorno_roteiros",
        "x-scope": "crm:ler",
        "x-read-only": true
      }
    },
    "/retornos/roteiros/{roteiro_id}": {
      "get": {
        "operationId": "retorno_roteiro_ler",
        "summary": "Roteiros de retorno (um roteiro pelo id)",
        "description": "Lista os roteiros prontos de retorno por nicho (veterinária, clínica, oficina, gás e água, imobiliária e geral), com o que cada um faz, o intervalo, a mensagem e se está ligado nesta conta, e os recomendados pro nicho da conta. Com `roteiro_id`, mostra a prévia: quantos clientes seriam lembrados nos próximos 7 dias se o roteiro fosse ligado, alguns exemplos e a mensagem pronta. Não liga nada: ligar um roteiro faz a conta lembrar clientes sozinha, e isso é com o dono, no app. Só leitura.",
        "tags": [
          "crm"
        ],
        "parameters": [
          {
            "name": "roteiro_id",
            "in": "path",
            "required": true,
            "description": "O `id` de um roteiro, pra ver a prévia de quem seria lembrado.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9_]{1,60}$"
            }
          },
          {
            "name": "nicho",
            "in": "query",
            "required": false,
            "description": "Só os roteiros deste nicho.",
            "schema": {
              "type": "string",
              "enum": [
                "vet",
                "clinica",
                "auto",
                "gas",
                "imobiliaria",
                "geral"
              ]
            }
          },
          {
            "name": "ligados",
            "in": "query",
            "required": false,
            "description": "Só os roteiros ligados nesta conta.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RetornoRoteirosResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "retorno_roteiros",
        "x-scope": "crm:ler",
        "x-read-only": true
      }
    },
    "/comissoes": {
      "get": {
        "operationId": "comissoes_resumo",
        "summary": "Comissões do mês",
        "description": "O relatório de comissões e repasses de um mês: cada profissional com a base, a comissão, o que já foi pago e o que falta pagar, os repasses feitos e o que ficou sem comissão (sem profissional, sem regra, esperando pagamento ou conclusão). Com `linhas`, cada atendimento ou venda que gerou comissão. Sem `mes`, o mês atual. Valores em reais. Só leitura.",
        "tags": [
          "erp"
        ],
        "parameters": [
          {
            "name": "mes",
            "in": "query",
            "required": false,
            "description": "Mês no formato YYYY-MM. Padrão: o mês atual.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-(0[1-9]|1[0-2])$"
            }
          },
          {
            "name": "profissional",
            "in": "query",
            "required": false,
            "description": "Só este profissional (o `staffId` da lista de profissionais).",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,128}$"
            }
          },
          {
            "name": "linhas",
            "in": "query",
            "required": false,
            "description": "Inclui cada atendimento ou venda que gerou comissão (até 200).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ComissoesResumoResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "comissoes_resumo",
        "x-scope": "erp:ler",
        "x-read-only": true
      }
    },
    "/pets": {
      "get": {
        "operationId": "pets_listar",
        "summary": "Listar pets",
        "description": "Lista os pets cadastrados nos clientes do CRM (o cartão do pet e os pets que vieram da planilha), com o tutor, o telefone e o `contatoId` de cada um, e marca os que faleceram. Busca por nome do pet, do tutor ou telefone. Olha os 1.500 contatos mais recentes. Só leitura.",
        "tags": [
          "pets"
        ],
        "parameters": [
          {
            "name": "busca",
            "in": "query",
            "required": false,
            "description": "Nome do pet ou do tutor, ou telefone (4 dígitos ou mais).",
            "schema": {
              "type": "string",
              "maxLength": 100
            }
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantos tutores devolver. Padrão 50.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PetsListarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "pets_listar",
        "x-scope": "pets:ler",
        "x-read-only": true
      }
    },
    "/pets/vacinas": {
      "get": {
        "operationId": "pet_vacinas_proximas",
        "summary": "Próximas vacinas dos pets",
        "description": "As próximas doses de vacina, vermífugo e antiparasitário de todos os pets da conta, da mais atrasada pra mais distante, com o pet, o tutor, o telefone e o dia em que vence, dentro de uma janela de dias. Pula pet falecido e cliente apagado. Não avisa ninguém. Só leitura.",
        "tags": [
          "pets"
        ],
        "parameters": [
          {
            "name": "dias",
            "in": "query",
            "required": false,
            "description": "Doses que vencem nos próximos tantos dias. Padrão 30.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 365
            }
          },
          {
            "name": "atrasadas",
            "in": "query",
            "required": false,
            "description": "Inclui as doses que já venceram. Padrão true.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "tipo",
            "in": "query",
            "required": false,
            "description": "Só doses deste tipo.",
            "schema": {
              "type": "string",
              "enum": [
                "vacina",
                "vermifugo",
                "antiparasitario"
              ]
            }
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantas doses devolver. Padrão 100.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 300
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PetVacinasProximasResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "pet_vacinas_proximas",
        "x-scope": "pets:ler",
        "x-read-only": true
      }
    },
    "/pets/{contato_id}/{pet}": {
      "get": {
        "operationId": "pet_prontuario_ler",
        "summary": "Ler o prontuário do pet",
        "description": "O prontuário de um pet: ficha (espécie, raça, sexo, nascimento, alergias, comportamento), pesos, vacinas e antiparasitários aplicados, as próximas doses com a situação de cada uma, os atendimentos (queixa, diagnóstico, conduta, prescrição) e os documentos emitidos. Precisa do `contatoId` do tutor e do nome do pet. Só leitura.",
        "tags": [
          "pets"
        ],
        "parameters": [
          {
            "name": "contato_id",
            "in": "path",
            "required": true,
            "description": "O `contatoId` do tutor, de pets_listar.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,128}$"
            }
          },
          {
            "name": "pet",
            "in": "path",
            "required": true,
            "description": "O nome do pet como aparece em pets_listar.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 80
            }
          },
          {
            "name": "atendimentos",
            "in": "query",
            "required": false,
            "description": "Quantos atendimentos devolver, do mais recente pro mais antigo. Padrão 10.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 50
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PetProntuarioLerResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "pet_prontuario_ler",
        "x-scope": "pets:ler",
        "x-read-only": true
      }
    },
    "/imoveis": {
      "get": {
        "operationId": "imoveis_listar",
        "summary": "Listar imóveis",
        "description": "Lista a carteira de imóveis da imobiliária com código, tipo, venda ou aluguel, situação, preço, bairro, quartos, se está nos portais e na vitrine, o que falta pra ir aos portais, quantos interessados e visitas e há quantos dias está em oferta. Traz o painel da carteira. Valores em reais. Só leitura.",
        "tags": [
          "imoveis"
        ],
        "parameters": [
          {
            "name": "busca",
            "in": "query",
            "required": false,
            "description": "Código, título, bairro ou cidade.",
            "schema": {
              "type": "string",
              "maxLength": 100
            }
          },
          {
            "name": "situacao",
            "in": "query",
            "required": false,
            "description": "Só imóveis nesta situação.",
            "schema": {
              "type": "string",
              "enum": [
                "disponivel",
                "reservado",
                "vendido",
                "alugado",
                "inativo"
              ]
            }
          },
          {
            "name": "transacao",
            "in": "query",
            "required": false,
            "description": "Só imóveis à venda ou só pra alugar.",
            "schema": {
              "type": "string",
              "enum": [
                "venda",
                "aluguel"
              ]
            }
          },
          {
            "name": "quartos",
            "in": "query",
            "required": false,
            "description": "Pelo menos tantos quartos.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 20
            }
          },
          {
            "name": "preco_max",
            "in": "query",
            "required": false,
            "description": "Preço máximo em reais (o de venda ou o de aluguel, conforme a `transacao`).",
            "schema": {
              "type": "number",
              "minimum": 0,
              "maximum": 1000000000
            }
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantos imóveis devolver. Padrão 50.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImoveisListarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "imoveis_listar",
        "x-scope": "imoveis:ler",
        "x-read-only": true
      }
    },
    "/imoveis/{id}": {
      "get": {
        "operationId": "imovel_ler",
        "summary": "Ler um imóvel",
        "description": "Um imóvel inteiro, pelo `id` ou pelo código: preços, condomínio, IPTU, áreas, cômodos, características, endereço, descrição, fotos, vídeo, situação, se sai nos portais e na vitrine e o que falta pra sair. Valores em reais. Só leitura.",
        "tags": [
          "imoveis"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "O `id` que imoveis_listar devolveu.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,128}$"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImovelLerResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "imovel_ler",
        "x-scope": "imoveis:ler",
        "x-read-only": true
      }
    },
    "/imobiliaria/leads": {
      "get": {
        "operationId": "imob_leads_roleta",
        "summary": "Leads e roleta de corretores",
        "description": "Os leads dos portais e da vitrine dos últimos 30 dias e a roleta de corretores: como a roleta distribui, o prazo pra aceitar, quem está de plantão, e cada lead com o imóvel, o corretor, a situação (aguardando, aceito, sem corretor, esgotado), as tentativas e o tempo de resposta. Com `desempenho_dias`, o desempenho de cada corretor no período. Não distribui nem avisa ninguém. Só leitura.",
        "tags": [
          "imoveis"
        ],
        "parameters": [
          {
            "name": "situacao",
            "in": "query",
            "required": false,
            "description": "Só leads nesta situação.",
            "schema": {
              "type": "string",
              "enum": [
                "aguardando",
                "aceito",
                "sem-corretor",
                "esgotado"
              ]
            }
          },
          {
            "name": "corretor",
            "in": "query",
            "required": false,
            "description": "Só leads deste corretor (o `id` da lista de corretores).",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,128}$"
            }
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantos leads devolver, do mais novo pro mais velho. Padrão 50; 0 devolve só a roleta e o resumo.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 200
            }
          },
          {
            "name": "desempenho",
            "in": "query",
            "required": false,
            "description": "Inclui o desempenho de cada corretor nos últimos tantos dias.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 180
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImobLeadsRoletaResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "imob_leads_roleta",
        "x-scope": "imoveis:ler",
        "x-read-only": true
      }
    },
    "/notas": {
      "get": {
        "operationId": "notas_listar",
        "summary": "Listar notas fiscais",
        "description": "Lista as notas fiscais da conta (NFS-e, NFC-e e NF-e), da mais nova pra mais velha, com número, situação (emitida, erro, cancelada, rascunho), valor, cliente, competência e o motivo da recusa quando deu erro, e diz se o emissor está configurado e o que falta. Valores em reais. Só leitura: não emite nem cancela nota.",
        "tags": [
          "fiscal"
        ],
        "parameters": [
          {
            "name": "mes",
            "in": "query",
            "required": false,
            "description": "Só notas da competência deste mês, YYYY-MM.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-(0[1-9]|1[0-2])$"
            }
          },
          {
            "name": "situacao",
            "in": "query",
            "required": false,
            "description": "Só notas nesta situação.",
            "schema": {
              "type": "string",
              "enum": [
                "emitida",
                "erro",
                "cancelada",
                "rascunho"
              ]
            }
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "description": "Quantas notas devolver. Padrão 50.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotasListarResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "notas_listar",
        "x-scope": "fiscal:ler",
        "x-read-only": true
      }
    },
    "/notas/{id}": {
      "get": {
        "operationId": "nota_status",
        "summary": "Situação de uma nota fiscal",
        "description": "A situação de UMA nota fiscal, pelo `id`: número, chave de acesso, valor, impostos, cliente, competência, o motivo da recusa ou do cancelamento, os links do PDF e do XML e se já foi mandada ao cliente. Mostra o que está gravado, sem consultar a prefeitura ou a SEFAZ de novo. Valores em reais. Só leitura.",
        "tags": [
          "fiscal"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "O `id` que notas_listar devolveu.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotaStatusResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "nota_status",
        "x-scope": "fiscal:ler",
        "x-read-only": true
      }
    },
    "/clinica/nps": {
      "get": {
        "operationId": "clinica_nps_resumo",
        "summary": "Pesquisa depois da consulta",
        "description": "O resultado da pesquisa depois da consulta (NPS de 0 a 10) num período: a nota NPS, quantas pesquisas saíram e quantas voltaram, promotores, neutros e detratores, quantos tocaram no botão de avaliar no Google, o NPS por profissional e por mês e os comentários mais recentes, detratores primeiro. Só leitura.",
        "tags": [
          "clinica"
        ],
        "parameters": [
          {
            "name": "dias",
            "in": "query",
            "required": false,
            "description": "O período, em dias até hoje. Padrão 90.",
            "schema": {
              "type": "integer",
              "minimum": 7,
              "maximum": 365
            }
          },
          {
            "name": "comentarios",
            "in": "query",
            "required": false,
            "description": "Quantos comentários devolver. Padrão 10.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 50
            }
          },
          {
            "name": "conta",
            "in": "query",
            "required": false,
            "description": "Conta em que agir, quando não é a sua (parceiro, outro negócio do mesmo dono, admin). Vazio = a sua.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_-]{1,64}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resultado da ferramenta, em JSON. Com chave de teste, ferramenta que grava devolve a simulação (`sandbox: true`, `simulado: true`) e nada é gravado.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClinicaNpsResumoResposta"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          },
          "404": {
            "$ref": "#/components/responses/Erro404"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "502": {
            "$ref": "#/components/responses/Erro502"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        },
        "x-mcp-tool": "clinica_nps_resumo",
        "x-scope": "clinica:ler",
        "x-read-only": true
      }
    },
    "/mcp": {
      "post": {
        "operationId": "mcp",
        "summary": "Servidor MCP (JSON-RPC 2.0)",
        "description": "Servidor MCP Streamable HTTP, sem estado e sem SSE: cada POST leva uma mensagem JSON-RPC 2.0 (ou um lote) e recebe JSON. Métodos: `initialize`, `ping`, `tools/list`, `tools/call`. As ferramentas são as mesmas operações deste documento. Versões do protocolo: 2025-11-25, 2025-06-18, 2025-03-26. Sem chave, o 401 traz `WWW-Authenticate` com os metadados OAuth (/.well-known/oauth-protected-resource).",
        "tags": [
          "mcp"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "description": "Mensagem JSON-RPC 2.0.",
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/JsonRpcPedido"
                  },
                  {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/JsonRpcPedido"
                    },
                    "minItems": 1
                  }
                ]
              },
              "example": {
                "jsonrpc": "2.0",
                "id": 1,
                "method": "tools/list"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resposta JSON-RPC 2.0 (ou a lista delas, num lote). Erro de ferramenta vem aqui, como resultado com `isError: true`.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "Certu-Modo": {
                "$ref": "#/components/headers/CertuModo"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/JsonRpcResposta"
                    },
                    {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/JsonRpcResposta"
                      },
                      "minItems": 1
                    }
                  ]
                }
              }
            }
          },
          "202": {
            "description": "Notificação ou resposta recebida: sem corpo."
          },
          "400": {
            "$ref": "#/components/responses/ErroMcp400"
          },
          "401": {
            "$ref": "#/components/responses/ErroMcp401"
          },
          "402": {
            "$ref": "#/components/responses/Erro402"
          },
          "413": {
            "$ref": "#/components/responses/Erro413"
          },
          "429": {
            "$ref": "#/components/responses/Erro429"
          },
          "500": {
            "$ref": "#/components/responses/Erro500"
          },
          "503": {
            "$ref": "#/components/responses/Erro503"
          },
          "default": {
            "$ref": "#/components/responses/ErroPadrao"
          }
        }
      }
    }
  },
  "x-deprecation-policy": {
    "currentVersion": "v1",
    "changes": "additive-only",
    "additiveChanges": [
      "new-fields",
      "new-endpoints",
      "new-optional-parameters"
    ],
    "breakingChanges": {
      "newVersionPath": "/api/v2"
    },
    "beforeRemovalOrChange": {
      "emailKeyOwners": true,
      "responseHeaders": [
        {
          "name": "Deprecation",
          "spec": "RFC 9745"
        },
        {
          "name": "Sunset",
          "spec": "RFC 8594"
        }
      ]
    },
    "deprecatedOperationsMarker": "deprecated: true",
    "description": "A v1 só muda por acréscimo. Mudança que quebra sai em /api/v2. Antes de remover ou mudar qualquer coisa da v1, quem tem chave é avisado por e-mail e os endereços afetados mandam os cabeçalhos Deprecation e Sunset com a data.",
    "externalDocs": {
      "description": "Política de versionamento e descontinuação",
      "url": "https://certu.com.br/docs#versionamento"
    }
  },
  "components": {
    "securitySchemes": {
      "chave": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "certu_sk_...",
        "description": "Chave da API: `certu_sk_...` (produção) ou `certu_sk_test_...` (teste). O token do conector do claude.ai também vale."
      }
    },
    "headers": {
      "RateLimitPolicy": {
        "description": "A política do limite por chave (IETF draft-ietf-httpapi-ratelimit-headers, structured field): `\"minuto\";q=<pedidos>;w=60`. Vai em toda resposta da API.",
        "schema": {
          "type": "string",
          "examples": [
            "\"minuto\";q=60;w=60"
          ]
        }
      },
      "RateLimit": {
        "description": "O estado da janela atual (IETF draft-ietf-httpapi-ratelimit-headers): `\"minuto\";r=<restantes>;t=<segundos até zerar>`. Vai quando a chave já foi contada no limite.",
        "schema": {
          "type": "string",
          "examples": [
            "\"minuto\";r=59;t=60"
          ]
        }
      },
      "RateLimitLimit": {
        "description": "Pedidos por minuto permitidos nesta chave.",
        "schema": {
          "type": "integer"
        }
      },
      "RateLimitRemaining": {
        "description": "Pedidos que ainda cabem neste minuto.",
        "schema": {
          "type": "integer"
        }
      },
      "CertuModo": {
        "description": "`teste` quando a chave é de teste (sandbox).",
        "schema": {
          "type": "string",
          "enum": [
            "teste"
          ]
        }
      },
      "RetryAfter": {
        "description": "Segundos até o limite por minuto liberar.",
        "schema": {
          "type": "integer"
        }
      },
      "Deprecation": {
        "description": "RFC 9745: só nas respostas de um endereço em descontinuação, com a data em que ele passou a ser descontinuado.",
        "schema": {
          "type": "string"
        }
      },
      "Sunset": {
        "description": "RFC 8594: só nas respostas de um endereço em descontinuação, com a data em que ele deixa de responder.",
        "schema": {
          "type": "string"
        }
      },
      "WWWAuthenticate": {
        "description": "Só no 401 do MCP: aponta pros metadados OAuth (`resource_metadata`) pra o cliente descobrir onde pedir login.",
        "schema": {
          "type": "string"
        }
      }
    },
    "schemas": {
      "Erro": {
        "type": "object",
        "description": "O formato único de erro da API REST: `error` é o código estável, legível por máquina; `message` explica pra pessoa; `detalhes` lista cada problema de parâmetro, quando há.",
        "required": [
          "error",
          "message"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Código estável do erro, por exemplo `parametros_invalidos`, `chave_invalida`, `plano`, `escopo_insuficiente`, `limite`, `falha_interna`.",
            "examples": [
              "parametros_invalidos",
              "chave_invalida",
              "limite"
            ]
          },
          "message": {
            "type": "string",
            "description": "O que aconteceu e o que fazer, em texto pra pessoa ler."
          },
          "detalhes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Cada problema encontrado na validação dos parâmetros."
          }
        }
      },
      "SimulacaoSandbox": {
        "type": "object",
        "properties": {
          "sandbox": {
            "type": "boolean",
            "const": true
          },
          "simulado": {
            "type": "boolean",
            "const": true
          },
          "ferramenta": {
            "type": "string",
            "description": "Nome da ferramenta simulada."
          },
          "argumentos": {
            "type": "object",
            "additionalProperties": true,
            "description": "Os argumentos aceitos."
          },
          "mensagem": {
            "type": "string"
          }
        },
        "required": [
          "sandbox",
          "simulado",
          "ferramenta",
          "argumentos",
          "mensagem"
        ],
        "description": "Resposta da chave de teste a uma ferramenta que grava: os parâmetros passaram na validação e nada foi gravado nem enviado."
      },
      "ContaResumoResposta": {
        "type": "object",
        "properties": {
          "plano": {
            "type": "object",
            "properties": {
              "id": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Id da faixa (chave opaca, não é preço)."
              },
              "nome": {
                "type": "string"
              }
            },
            "required": [
              "id",
              "nome"
            ]
          },
          "creditos": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "doMes": {
                "type": "number",
                "description": "Créditos do mês."
              },
              "usadosNoMes": {
                "type": "number"
              },
              "restamNoMes": {
                "type": "number"
              },
              "avulsos": {
                "type": "number",
                "description": "Créditos comprados à parte."
              },
              "restamParaAcoes": {
                "type": "number"
              }
            },
            "required": [
              "doMes",
              "usadosNoMes",
              "restamNoMes",
              "avulsos",
              "restamParaAcoes"
            ],
            "description": "Créditos; null quando a leitura falhou."
          },
          "inclui": {
            "type": "object",
            "properties": {
              "agenteDeAnuncios": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Gestor de tráfego pago; null quando o plano não pôde ser lido."
              },
              "publicarSite": {
                "type": "boolean"
              },
              "instagramEMessenger": {
                "type": "boolean"
              },
              "erp": {
                "type": "boolean"
              }
            },
            "required": [
              "agenteDeAnuncios",
              "publicarSite",
              "instagramEMessenger",
              "erp"
            ],
            "description": "O que o plano inclui."
          }
        },
        "required": [
          "plano",
          "creditos",
          "inclui"
        ],
        "description": "Plano, créditos e o que o plano inclui."
      },
      "ConversasListarResposta": {
        "type": "object",
        "properties": {
          "conversasOlhadas": {
            "type": "integer",
            "description": "Quantas conversas recentes foram lidas pra filtrar."
          },
          "encontradas": {
            "type": "integer",
            "description": "Quantos passaram pelos filtros, antes do limite."
          },
          "mostrando": {
            "type": "integer",
            "description": "Quantos vieram nesta resposta."
          },
          "conversas": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "contato": {
                  "type": "string",
                  "description": "O contato, pra usar em conversa_ler."
                },
                "canal": {
                  "type": "string"
                },
                "nome": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "atualizadaEm": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Data e hora (ISO 8601), ou null."
                },
                "ultimaDoClienteEm": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Data e hora (ISO 8601), ou null."
                },
                "naoLida": {
                  "type": "boolean"
                },
                "iaPausadaNestaConversa": {
                  "type": "boolean"
                },
                "passouProDonoEm": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Data e hora (ISO 8601), ou null."
                },
                "atendidaPor": {
                  "description": "Quem da equipe está atendendo."
                },
                "rascunhoEsperandoAprovacao": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "ultimaMensagem": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "properties": {
                    "de": {
                      "type": "string",
                      "enum": [
                        "cliente",
                        "empresa"
                      ],
                      "description": "Quem escreveu: `cliente` ou `empresa` (a IA ou uma pessoa da equipe)."
                    },
                    "texto": {
                      "type": "string",
                      "description": "Texto da mensagem, cortado no tamanho máximo."
                    },
                    "em": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time",
                      "description": "Data e hora (ISO 8601), ou null."
                    },
                    "midia": {
                      "type": "string",
                      "enum": [
                        "imagem",
                        "audio",
                        "documento"
                      ],
                      "description": "Tipo de mídia anexada, quando houver."
                    }
                  },
                  "required": [
                    "de",
                    "texto",
                    "em"
                  ],
                  "description": "Uma mensagem da conversa."
                }
              },
              "required": [
                "nome",
                "atualizadaEm",
                "ultimaDoClienteEm",
                "naoLida",
                "iaPausadaNestaConversa",
                "passouProDonoEm",
                "rascunhoEsperandoAprovacao",
                "ultimaMensagem"
              ]
            }
          },
          "aviso": {
            "type": "string",
            "description": "Aviso em texto pra mostrar ao dono."
          }
        },
        "required": [
          "conversasOlhadas",
          "encontradas",
          "mostrando",
          "conversas"
        ],
        "description": "Conversas mais recentes, da mais nova pra mais velha."
      },
      "ConversaLerResposta": {
        "type": "object",
        "properties": {
          "contato": {
            "type": "string"
          },
          "canal": {
            "type": [
              "string",
              "null"
            ]
          },
          "total": {
            "type": "integer",
            "description": "Quantos existem, antes do limite."
          },
          "mostrando": {
            "type": "integer",
            "description": "Quantos vieram nesta resposta."
          },
          "fonte": {
            "type": "string",
            "enum": [
              "arquivo",
              "ultimas_mensagens"
            ],
            "description": "`arquivo` (histórico permanente) ou `ultimas_mensagens` (só a janela guardada na conversa)."
          },
          "completo": {
            "type": "boolean"
          },
          "mensagens": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "de": {
                  "type": "string",
                  "enum": [
                    "cliente",
                    "empresa"
                  ],
                  "description": "Quem escreveu: `cliente` ou `empresa` (a IA ou uma pessoa da equipe)."
                },
                "texto": {
                  "type": "string",
                  "description": "Texto da mensagem, cortado no tamanho máximo."
                },
                "em": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time",
                  "description": "Data e hora (ISO 8601), ou null."
                },
                "midia": {
                  "type": "string",
                  "enum": [
                    "imagem",
                    "audio",
                    "documento"
                  ],
                  "description": "Tipo de mídia anexada, quando houver."
                }
              },
              "required": [
                "de",
                "texto",
                "em"
              ],
              "description": "Uma mensagem da conversa."
            },
            "description": "Da mais antiga pra mais nova."
          }
        },
        "required": [
          "contato",
          "canal",
          "total",
          "mostrando",
          "fonte",
          "completo",
          "mensagens"
        ],
        "description": "O histórico de uma conversa."
      },
      "CerebroListarResposta": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "Quantos existem, antes do limite."
          },
          "mostrando": {
            "type": "integer",
            "description": "Quantos vieram nesta resposta."
          },
          "fichas": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "titulo": {
                  "type": "string"
                },
                "conteudo": {
                  "type": "string"
                },
                "categoria": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "atualizadaEm": {}
              },
              "required": [
                "id",
                "titulo",
                "conteudo",
                "categoria",
                "atualizadaEm"
              ]
            }
          }
        },
        "required": [
          "total",
          "mostrando",
          "fichas"
        ],
        "description": "Fichas do Cérebro."
      },
      "CerebroSalvarResposta": {
        "description": "Ficha gravada.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "id": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Id do registro, pra usar nas outras ferramentas."
              },
              "pendenteDeAprovacao": {
                "type": "boolean",
                "description": "A ficha espera o dono aprovar no app antes de valer."
              },
              "aviso": {
                "description": "Aviso em texto pra mostrar ao dono."
              }
            },
            "required": [
              "ok",
              "id",
              "pendenteDeAprovacao"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "CerebroApagarResposta": {
        "description": "Fichas apagadas.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "apagadas": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "titulo": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "titulo"
                  ]
                }
              },
              "naoAchadas": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Ids que não existiam."
              }
            },
            "required": [
              "ok",
              "apagadas"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "ProdutosListarResposta": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "Quantos existem, antes do limite."
          },
          "produtos": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "nome": {
                  "type": "string"
                },
                "preco": {
                  "type": "string",
                  "description": "Preço como o cliente ouve (texto livre)."
                },
                "descricao": {
                  "type": "string"
                },
                "disponivel": {
                  "type": "boolean"
                },
                "exemplo": {
                  "type": "boolean",
                  "description": "Produto de exemplo com preço inventado: a IA não usa."
                },
                "aviso": {
                  "type": "string",
                  "description": "Aviso em texto pra mostrar ao dono."
                },
                "unidade": {},
                "codigo": {},
                "grupo": {},
                "estoque": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Saldo, quando o produto controla estoque."
                }
              },
              "required": [
                "id",
                "nome",
                "preco",
                "descricao",
                "disponivel"
              ]
            }
          }
        },
        "required": [
          "total",
          "produtos"
        ],
        "description": "Produtos e serviços."
      },
      "ProdutoSalvarResposta": {
        "description": "Produto gravado.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "id": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Id do registro, pra usar nas outras ferramentas."
              }
            },
            "required": [
              "ok",
              "id"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "AgenteLerResposta": {
        "type": "object",
        "properties": {
          "ajustaveisPorAqui": {
            "type": "object",
            "additionalProperties": true,
            "description": "Os campos que agente_ajustar muda, com o valor atual."
          },
          "configuracaoCompleta": {
            "type": "object",
            "additionalProperties": true,
            "description": "A configuração inteira da IA, como gravada."
          }
        },
        "required": [
          "ajustaveisPorAqui",
          "configuracaoCompleta"
        ],
        "description": "Configuração da IA do WhatsApp."
      },
      "AgenteAjustarResposta": {
        "description": "Ajustes gravados.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "alterados": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Os campos mandados."
              }
            },
            "required": [
              "ok",
              "alterados"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "AnuncioOpcoesResposta": {
        "type": "object",
        "properties": {
          "permitidoNoPlano": {
            "type": "boolean"
          },
          "creditos": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Saldo de créditos do plano (granted, used, remaining, extra)."
          },
          "custoDoKitEmCreditos": {
            "type": [
              "number",
              "null"
            ]
          },
          "tiposDeNegocio": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "slug": {
                  "type": "string"
                },
                "nome": {
                  "type": "string"
                },
                "ofertas": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "slug": {
                        "type": "string"
                      },
                      "label": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "slug",
                      "label"
                    ]
                  }
                },
                "orcamentoMensalSugerido": {
                  "type": [
                    "number",
                    "null"
                  ]
                }
              },
              "required": [
                "slug",
                "nome",
                "ofertas",
                "orcamentoMensalSugerido"
              ]
            }
          },
          "formatos": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "slug": {
                  "type": "string"
                },
                "nome": {
                  "type": "string"
                },
                "descricao": {}
              },
              "required": [
                "slug",
                "nome"
              ]
            }
          }
        },
        "required": [
          "permitidoNoPlano",
          "creditos",
          "custoDoKitEmCreditos",
          "tiposDeNegocio",
          "formatos"
        ],
        "description": "O que dá pra montar de anúncio nesta conta."
      },
      "AnuncioGerarResposta": {
        "description": "Kit de campanha gerado. Nada foi publicado.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "kitId": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Id do kit salvo; null quando não foi salvo."
              },
              "nome": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "aviso": {
                "type": "string",
                "description": "Aviso em texto pra mostrar ao dono."
              },
              "kit": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": true,
                "description": "O kit gerado (textos, imagens e público)."
              }
            },
            "required": [
              "kitId",
              "nome",
              "kit"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "KitsDeCampanha": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "Quantos existem, antes do limite."
          },
          "kits": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "kitId": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "nome": {},
                "criadoEm": {},
                "tipoDeNegocio": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "oferta": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "publicado": {
                  "type": "boolean"
                },
                "resultados": {
                  "description": "Resultado do kit publicado, ou null."
                }
              },
              "required": [
                "kitId",
                "criadoEm",
                "tipoDeNegocio",
                "oferta",
                "publicado",
                "resultados"
              ]
            }
          }
        },
        "required": [
          "total",
          "kits"
        ],
        "description": "Kits de campanha já gerados."
      },
      "KitDeCampanha": {
        "type": "object",
        "properties": {
          "kitId": {
            "type": "string"
          },
          "tipoDeNegocio": {
            "type": [
              "string",
              "null"
            ]
          },
          "kit": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true
          },
          "publicacao": {
            "description": "Dados da publicação na Meta, ou null."
          },
          "resultados": {}
        },
        "required": [
          "kitId",
          "tipoDeNegocio",
          "kit",
          "publicacao",
          "resultados"
        ],
        "description": "Um kit de campanha inteiro."
      },
      "AnunciosListarResposta": {
        "description": "Resposta de anuncios_listar: uma de KitsDeCampanha, KitDeCampanha.",
        "anyOf": [
          {
            "$ref": "#/components/schemas/KitsDeCampanha"
          },
          {
            "$ref": "#/components/schemas/KitDeCampanha"
          }
        ]
      },
      "AnuncioPublicarPausadoResposta": {
        "description": "Campanha criada pausada.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "status": {
                "description": "Status da campanha na Meta; `PAUSED` quando deu certo."
              },
              "campanhaId": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "linkNoGerenciador": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "whatsapp": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "aviso": {
                "type": "string",
                "description": "Aviso em texto pra mostrar ao dono."
              }
            },
            "required": [
              "status",
              "campanhaId",
              "linkNoGerenciador",
              "whatsapp",
              "aviso"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "AnunciosCampanhasResposta": {
        "type": "object",
        "properties": {
          "contaDeAnuncios": {
            "type": [
              "string",
              "null"
            ]
          },
          "periodo": {
            "type": "string"
          },
          "total": {
            "type": "integer",
            "description": "Quantos existem, antes do limite."
          },
          "gastoTotal": {
            "type": "number",
            "description": "Na moeda da conta de anúncios."
          },
          "resultadosTotal": {
            "type": "number"
          },
          "custoPorResultadoGeral": {
            "type": [
              "number",
              "null"
            ]
          },
          "campanhas": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "campanhaId": {
                  "type": "string"
                },
                "nome": {},
                "situacao": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "objetivo": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "criadaEm": {},
                "orcamentoDiario": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "gasto": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "resultados": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "custoPorResultado": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "impressoes": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "alcance": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "cliquesNoLink": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "taxaDeCliqueNoLink": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "motivosDeReprovacao": {
                  "type": "array",
                  "items": {}
                },
                "montadaNaCertu": {
                  "type": "boolean"
                },
                "kitId": {
                  "type": "string"
                }
              },
              "required": [
                "campanhaId",
                "situacao",
                "objetivo",
                "criadaEm",
                "orcamentoDiario",
                "gasto",
                "resultados",
                "custoPorResultado",
                "impressoes",
                "alcance",
                "cliquesNoLink",
                "taxaDeCliqueNoLink",
                "montadaNaCertu"
              ]
            }
          },
          "aviso": {
            "type": "string",
            "description": "Aviso em texto pra mostrar ao dono."
          }
        },
        "required": [
          "contaDeAnuncios",
          "periodo",
          "total",
          "gastoTotal",
          "resultadosTotal",
          "custoPorResultadoGeral",
          "campanhas",
          "aviso"
        ],
        "description": "Campanhas da conta de anúncios da Meta, desde o começo de cada uma."
      },
      "AnuncioPausarResposta": {
        "description": "Campanha pausada.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "campanhaId": {
                "type": "string"
              },
              "situacao": {
                "type": "string",
                "enum": [
                  "pausada"
                ]
              },
              "aviso": {
                "type": "string",
                "description": "Aviso em texto pra mostrar ao dono."
              }
            },
            "required": [
              "campanhaId",
              "situacao",
              "aviso"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "AnuncioOrcamentoResposta": {
        "description": "Orçamento mudado.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "campanhaId": {
                "type": "string"
              },
              "orcamentoDiario": {
                "type": "number",
                "description": "Novo total por dia."
              },
              "porConjunto": {
                "type": "array",
                "items": {},
                "description": "Como o total foi repartido entre os conjuntos."
              },
              "ondeMudou": {
                "type": "string",
                "enum": [
                  "na campanha",
                  "nos conjuntos"
                ],
                "description": "Se o orçamento mudou na campanha ou nos conjuntos."
              }
            },
            "required": [
              "campanhaId",
              "orcamentoDiario",
              "ondeMudou"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "AnuncioRelatorioResposta": {
        "type": "object",
        "properties": {
          "campanha": {
            "type": "object",
            "properties": {
              "id": {},
              "nome": {},
              "objetivo": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "situacao": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "criadaEm": {},
              "orcamentoDiario": {},
              "orcamentoTotal": {},
              "moeda": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "linkNoGerenciador": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "id",
              "nome",
              "objetivo",
              "situacao",
              "criadaEm",
              "orcamentoDiario",
              "orcamentoTotal",
              "moeda",
              "linkNoGerenciador"
            ]
          },
          "periodo": {
            "type": "string"
          },
          "metricas": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Métricas da campanha no período."
          },
          "publico": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true
          },
          "conjuntos": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "nome": {},
                "situacao": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "orcamentoDiario": {},
                "otimizacao": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "situacao",
                "orcamentoDiario",
                "otimizacao"
              ]
            }
          },
          "anuncios": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "nome": {},
                "situacao": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "motivosDeReprovacao": {
                  "type": "array",
                  "items": {}
                },
                "texto": {
                  "type": "string"
                },
                "titulo": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "botao": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "imagem": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "video": {
                  "type": "boolean"
                },
                "link": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "metricas": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "additionalProperties": true
                }
              },
              "required": [
                "situacao",
                "texto",
                "titulo",
                "botao",
                "imagem",
                "video",
                "link",
                "metricas"
              ]
            }
          },
          "diaADia": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Gasto e resultado dia a dia."
          },
          "lidoEm": {}
        },
        "required": [
          "campanha",
          "periodo",
          "metricas",
          "publico",
          "conjuntos",
          "anuncios",
          "diaADia",
          "lidoEm"
        ],
        "description": "Relatório de uma campanha, lido ao vivo na Meta."
      },
      "SiteLerResposta": {
        "type": "object",
        "properties": {
          "existe": {
            "type": "boolean"
          },
          "publicado": {
            "type": "boolean"
          },
          "endereco": {
            "type": [
              "string",
              "null"
            ]
          },
          "modelo": {},
          "config": {
            "type": "object",
            "additionalProperties": true,
            "description": "O conteúdo do site, sem o texto completo dos artigos."
          }
        },
        "required": [
          "existe",
          "publicado",
          "endereco",
          "modelo",
          "config"
        ],
        "description": "O site da conta."
      },
      "SiteCriarResposta": {
        "description": "Site montado (não publicado).",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "nome": {
                "type": "string"
              },
              "segmento": {
                "type": "string"
              },
              "paginas": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Quantas páginas o site ficou tendo."
              },
              "proximoPasso": {
                "type": "string"
              }
            },
            "required": [
              "ok",
              "nome",
              "segmento",
              "paginas",
              "proximoPasso"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "SitePublicarResposta": {
        "description": "Site no ar.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "endereco": {
                "type": "string"
              },
              "url": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "ok",
              "endereco",
              "url"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "ArtigosDoSite": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "Quantos existem, antes do limite."
          },
          "artigos": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "slug": {
                  "type": "string"
                },
                "titulo": {},
                "resumo": {},
                "data": {},
                "fonte": {}
              },
              "required": [
                "titulo",
                "resumo",
                "data",
                "fonte"
              ]
            }
          }
        },
        "required": [
          "total",
          "artigos"
        ],
        "description": "Artigos do blog, do mais novo pro mais velho."
      },
      "ArtigoDoSite": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "titulo": {},
          "resumo": {},
          "data": {},
          "fonte": {},
          "imagem": {},
          "corpo": {
            "description": "O texto completo."
          }
        },
        "required": [
          "titulo",
          "resumo",
          "data",
          "fonte",
          "imagem",
          "corpo"
        ],
        "description": "Um artigo inteiro."
      },
      "SiteArtigosResposta": {
        "description": "Resposta de site_artigos: uma de ArtigosDoSite, ArtigoDoSite.",
        "anyOf": [
          {
            "$ref": "#/components/schemas/ArtigosDoSite"
          },
          {
            "$ref": "#/components/schemas/ArtigoDoSite"
          }
        ]
      },
      "AgendaListarResposta": {
        "type": "object",
        "properties": {
          "de": {
            "type": "string",
            "description": "Dia, YYYY-MM-DD."
          },
          "ate": {
            "type": "string",
            "description": "Dia, YYYY-MM-DD."
          },
          "total": {
            "type": "integer",
            "description": "Quantos existem, antes do limite."
          },
          "mostrando": {
            "type": "integer",
            "description": "Quantos vieram nesta resposta."
          },
          "pendentes": {
            "type": "integer",
            "description": "Agendamentos esperando o dono confirmar."
          },
          "agendamentos": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "cliente": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "telefone": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "servico": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "inicio": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Início no horário da empresa, YYYY-MM-DDTHH:MM."
                },
                "duracaoMin": {
                  "type": "integer",
                  "description": "Duração em minutos (60 quando não foi definida)."
                },
                "status": {
                  "type": "string",
                  "description": "`pendente`, `confirmado`, `cancelado`, `realizado` ou o valor cru."
                },
                "origem": {
                  "type": "string",
                  "description": "De onde veio: link de agendamento, marcado pela empresa ou IA do WhatsApp."
                },
                "endereco": {
                  "type": "string"
                },
                "linkDaVideochamada": {
                  "type": "string"
                },
                "profissionalId": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "cliente",
                "telefone",
                "servico",
                "inicio",
                "duracaoMin",
                "status",
                "origem"
              ],
              "description": "Um agendamento."
            }
          },
          "bloqueios": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "dia": {
                  "type": "string",
                  "description": "Dia, YYYY-MM-DD."
                },
                "das": {
                  "type": "string",
                  "description": "Começa às, HH:MM."
                },
                "ate": {
                  "type": "string",
                  "description": "Termina às, HH:MM."
                },
                "motivo": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "profissionalId": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "dia",
                "das",
                "ate",
                "motivo"
              ],
              "description": "Um bloqueio da agenda."
            }
          },
          "aviso": {
            "type": "string",
            "description": "Aviso em texto pra mostrar ao dono."
          }
        },
        "required": [
          "de",
          "ate",
          "total",
          "mostrando",
          "pendentes",
          "agendamentos",
          "bloqueios"
        ],
        "description": "Agenda no intervalo pedido."
      },
      "AgendaMarcarResposta": {
        "description": "Horário marcado e confirmado.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "id": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Id do registro, pra usar nas outras ferramentas."
              },
              "inicio": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "enum": [
                  "confirmado"
                ]
              },
              "aviso": {
                "type": "string",
                "description": "Lembrete de que o cliente não foi avisado: a API não manda mensagem."
              }
            },
            "required": [
              "ok",
              "id",
              "inicio",
              "status",
              "aviso"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "AgendaRemarcarResposta": {
        "description": "Horário remarcado.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "id": {
                "type": "string"
              },
              "antes": {
                "type": "string",
                "description": "Início anterior."
              },
              "inicio": {
                "type": "string"
              },
              "aviso": {
                "type": "string",
                "description": "Lembrete de que o cliente não foi avisado: a API não manda mensagem."
              }
            },
            "required": [
              "ok",
              "id",
              "antes",
              "inicio",
              "aviso"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "AgendaConfirmarResposta": {
        "description": "Horário confirmado.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "id": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "enum": [
                  "confirmado"
                ]
              },
              "aviso": {
                "type": "string",
                "description": "Lembrete de que o cliente não foi avisado: a API não manda mensagem."
              }
            },
            "required": [
              "ok",
              "id",
              "status",
              "aviso"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "AgendaCancelarResposta": {
        "description": "Horário cancelado.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "id": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "enum": [
                  "cancelado"
                ]
              },
              "jaEstavaCancelado": {
                "type": "boolean"
              },
              "cliente": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "telefone": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "inicio": {
                "type": "string"
              },
              "aviso": {
                "type": "string",
                "description": "Lembrete de que o cliente não foi avisado: a API não manda mensagem."
              }
            },
            "required": [
              "ok",
              "id",
              "status"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "BloqueioCriado": {
        "description": "Bloqueio criado.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "bloqueio": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "id": {},
                  "dia": {},
                  "das": {},
                  "ate": {},
                  "motivo": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "motivo"
                ]
              },
              "aviso": {
                "type": "string",
                "description": "Aviso em texto pra mostrar ao dono."
              }
            },
            "required": [
              "ok",
              "bloqueio",
              "aviso"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "BloqueioRemovido": {
        "description": "Bloqueio removido.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "removido": {
                "type": "string",
                "description": "Id do bloqueio removido."
              },
              "bloqueiosAgora": {
                "type": [
                  "integer",
                  "null"
                ]
              }
            },
            "required": [
              "ok",
              "removido",
              "bloqueiosAgora"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "AgendaBloquearResposta": {
        "description": "Resposta de agenda_bloquear: uma de BloqueioCriado, BloqueioRemovido.",
        "anyOf": [
          {
            "$ref": "#/components/schemas/BloqueioCriado"
          },
          {
            "$ref": "#/components/schemas/BloqueioRemovido"
          }
        ]
      },
      "ErpEstoqueResposta": {
        "type": "object",
        "properties": {
          "totalControlados": {
            "type": "integer"
          },
          "mostrando": {
            "type": "integer",
            "description": "Quantos vieram nesta resposta."
          },
          "produtosSemControleDeEstoque": {},
          "valorEmEstoque": {
            "type": [
              "number",
              "null"
            ],
            "description": "Em reais (centavos divididos por 100); null quando não há valor."
          },
          "custoDoVendidoNoMes": {
            "type": [
              "number",
              "null"
            ],
            "description": "Em reais (centavos divididos por 100); null quando não há valor."
          },
          "avisoCusto": {
            "type": "string",
            "description": "Aviso em texto pra mostrar ao dono."
          },
          "alertas": {
            "type": "object",
            "properties": {
              "acabou": {
                "type": "array",
                "items": {}
              },
              "acabando": {
                "type": "array",
                "items": {}
              },
              "negativo": {
                "type": "array",
                "items": {}
              }
            },
            "required": [
              "acabou",
              "acabando",
              "negativo"
            ],
            "description": "Produtos que acabaram, estão acabando ou ficaram negativos."
          },
          "itens": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "produtoId": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "nome": {},
                "codigo": {},
                "unidade": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "saldo": {},
                "minimo": {},
                "situacao": {
                  "description": "`negativo`, `acabou`, `acabando` ou `ok`."
                },
                "custoUnitario": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Em reais (centavos divididos por 100); null quando não há valor."
                },
                "precoDeVenda": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Em reais (centavos divididos por 100); null quando não há valor."
                },
                "margem": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Em reais (centavos divididos por 100); null quando não há valor."
                },
                "margemPercentual": {}
              },
              "required": [
                "produtoId",
                "unidade",
                "minimo",
                "custoUnitario",
                "precoDeVenda",
                "margem",
                "margemPercentual"
              ]
            }
          },
          "movimentos": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Últimas entradas e saídas (até 30), valores em reais."
          }
        },
        "required": [
          "totalControlados",
          "mostrando",
          "produtosSemControleDeEstoque",
          "valorEmEstoque",
          "custoDoVendidoNoMes",
          "alertas",
          "itens"
        ],
        "description": "O estoque."
      },
      "ErpEstoqueMovimentarResposta": {
        "description": "Movimento lançado.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "movimentoId": {},
              "saldoAgora": {},
              "aviso": {
                "type": "string",
                "description": "Aviso em texto pra mostrar ao dono."
              }
            },
            "required": [
              "ok",
              "movimentoId",
              "saldoAgora"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "ErpCaixaResposta": {
        "type": "object",
        "properties": {
          "mes": {
            "description": "O mês, YYYY-MM."
          },
          "de": {},
          "ate": {},
          "resumo": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Entradas e saídas pagas e previstas, em reais."
          },
          "resultado": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true
          },
          "custoDaMercadoriaVendida": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "valor": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Em reais (centavos divididos por 100); null quando não há valor."
              },
              "aviso": {
                "type": "string"
              },
              "parcial": {
                "type": "boolean"
              }
            },
            "required": [
              "valor"
            ]
          },
          "porCategoria": {},
          "comissoes": {},
          "totalDeLancamentos": {
            "type": "integer"
          },
          "lancamentos": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "tipo": {
                  "description": "`entrada` ou `saida`."
                },
                "valor": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Em reais (centavos divididos por 100); null quando não há valor."
                },
                "descricao": {},
                "categoria": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "dia": {},
                "situacao": {
                  "description": "`pago` ou `previsto`."
                },
                "forma": {},
                "observacao": {},
                "conferidoComOBanco": {
                  "type": "boolean"
                }
              },
              "required": [
                "id",
                "valor",
                "categoria"
              ]
            }
          }
        },
        "required": [
          "mes",
          "de",
          "ate",
          "resumo",
          "resultado",
          "custoDaMercadoriaVendida",
          "porCategoria",
          "comissoes",
          "totalDeLancamentos",
          "lancamentos"
        ],
        "description": "O caixa de um mês. Valores em reais."
      },
      "ErpCaixaLancarResposta": {
        "description": "Lançamento gravado.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "id": {
                "description": "Id do registro, pra usar nas outras ferramentas."
              },
              "corrigido": {
                "type": "boolean",
                "description": "true quando corrigiu um lançamento existente."
              },
              "lancamento": {
                "type": "object",
                "properties": {
                  "tipo": {
                    "type": "string"
                  },
                  "valor": {
                    "type": "number"
                  },
                  "descricao": {
                    "type": "string"
                  },
                  "dia": {
                    "type": "string"
                  }
                },
                "required": [
                  "tipo",
                  "valor",
                  "descricao",
                  "dia"
                ]
              }
            },
            "required": [
              "ok",
              "id",
              "corrigido",
              "lancamento"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "ErpResultadoResposta": {
        "type": "object",
        "properties": {
          "mes": {},
          "demonstrativo": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "O demonstrativo do mês, em reais."
          },
          "comparativo": {},
          "projecaoDoSaldo": {},
          "categoriasSemClassificacao": {
            "type": "array",
            "items": {}
          },
          "aviso": {
            "type": "string",
            "description": "Aviso em texto pra mostrar ao dono."
          }
        },
        "required": [
          "mes",
          "demonstrativo",
          "comparativo",
          "projecaoDoSaldo",
          "categoriasSemClassificacao"
        ],
        "description": "Demonstrativo de resultado."
      },
      "LigacoesListarResposta": {
        "type": "object",
        "properties": {
          "ligacoesOlhadas": {
            "type": "integer"
          },
          "encontradas": {
            "type": "integer",
            "description": "Quantos passaram pelos filtros, antes do limite."
          },
          "mostrando": {
            "type": "integer",
            "description": "Quantos vieram nesta resposta."
          },
          "pediramRetorno": {
            "type": "integer"
          },
          "minutosNoTotal": {
            "type": "integer"
          },
          "ligacoes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "em": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Quando começou."
                },
                "duracaoSegundos": {
                  "type": "number"
                },
                "tipo": {
                  "type": "string",
                  "enum": [
                    "equipe pelo discador",
                    "atendente de voz"
                  ],
                  "description": "Quem falou do lado da empresa: a equipe pelo discador ou o atendente de voz."
                },
                "nome": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "telefone": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "motivo": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "resumo": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "pediuRetorno": {
                  "type": "boolean",
                  "description": "A pessoa pediu pra falar com alguém da equipe."
                },
                "resultado": {
                  "type": "string"
                },
                "anotado": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "O que o atendente anotou na ligação (campos livres)."
                }
              },
              "required": [
                "id",
                "em",
                "duracaoSegundos",
                "tipo",
                "nome",
                "telefone",
                "motivo",
                "resumo",
                "pediuRetorno"
              ],
              "description": "Uma ligação, sem a transcrição."
            }
          },
          "aviso": {
            "type": "string",
            "description": "Aviso em texto pra mostrar ao dono."
          }
        },
        "required": [
          "ligacoesOlhadas",
          "encontradas",
          "mostrando",
          "pediramRetorno",
          "minutosNoTotal",
          "ligacoes"
        ],
        "description": "Ligações, da mais nova pra mais velha."
      },
      "LigacaoLerResposta": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do registro, pra usar nas outras ferramentas."
          },
          "em": {
            "type": [
              "string",
              "null"
            ],
            "description": "Quando começou."
          },
          "duracaoSegundos": {
            "type": "number"
          },
          "tipo": {
            "type": "string",
            "enum": [
              "equipe pelo discador",
              "atendente de voz"
            ],
            "description": "Quem falou do lado da empresa: a equipe pelo discador ou o atendente de voz."
          },
          "nome": {
            "type": [
              "string",
              "null"
            ]
          },
          "telefone": {
            "type": [
              "string",
              "null"
            ]
          },
          "motivo": {
            "type": [
              "string",
              "null"
            ]
          },
          "resumo": {
            "type": [
              "string",
              "null"
            ]
          },
          "pediuRetorno": {
            "type": "boolean",
            "description": "A pessoa pediu pra falar com alguém da equipe."
          },
          "resultado": {
            "type": "string"
          },
          "anotado": {
            "type": "object",
            "additionalProperties": true,
            "description": "O que o atendente anotou na ligação (campos livres)."
          },
          "correcoesDoDono": {
            "type": "object",
            "additionalProperties": true
          },
          "falas": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "quem": {
                  "type": "string",
                  "enum": [
                    "atendente",
                    "cliente"
                  ]
                },
                "texto": {
                  "type": "string"
                },
                "segundo": {
                  "type": "number"
                }
              },
              "required": [
                "quem",
                "texto"
              ]
            },
            "description": "A transcrição fala por fala (até 300)."
          },
          "avisoFalas": {
            "type": "string"
          },
          "transcricao": {
            "type": "string",
            "description": "Transcrição em texto corrido (ligação da equipe pelo discador)."
          }
        },
        "required": [
          "id",
          "em",
          "duracaoSegundos",
          "tipo",
          "nome",
          "telefone",
          "motivo",
          "resumo",
          "pediuRetorno",
          "falas"
        ],
        "description": "Uma ligação inteira."
      },
      "CrmFunilResposta": {
        "type": "object",
        "properties": {
          "etapas": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "etapaId": {
                  "type": "string"
                },
                "nome": {},
                "negocios": {
                  "type": "integer"
                },
                "valorSomado": {
                  "type": "number"
                }
              },
              "required": [
                "etapaId",
                "negocios",
                "valorSomado"
              ]
            }
          },
          "campos": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "nome": {}
              },
              "required": [
                "id"
              ]
            }
          },
          "encontrados": {
            "type": "integer",
            "description": "Quantos passaram pelos filtros, antes do limite."
          },
          "negocios": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "titulo": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "contato": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "contatoId": {
                  "type": "string"
                },
                "telefone": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "valor": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Em reais (centavos divididos por 100); null quando não há valor."
                },
                "etapa": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Nome da etapa."
                },
                "etapaId": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "naEtapaDesde": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Data e hora (ISO 8601), ou null."
                },
                "atualizadoEm": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Data e hora (ISO 8601), ou null."
                },
                "campos": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "Campos do funil preenchidos, pelo nome do campo."
                },
                "ultimasNotas": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "As 3 notas mais recentes."
                },
                "totalDeNotas": {
                  "type": "integer"
                }
              },
              "required": [
                "id",
                "titulo",
                "contato",
                "telefone",
                "valor",
                "etapa",
                "etapaId",
                "naEtapaDesde",
                "atualizadoEm"
              ],
              "description": "Um negócio do funil."
            }
          }
        },
        "required": [
          "etapas",
          "campos",
          "encontrados",
          "negocios"
        ],
        "description": "O funil de vendas."
      },
      "CrmContatosResposta": {
        "type": "object",
        "properties": {
          "totalNoCrm": {
            "type": "integer"
          },
          "encontrados": {
            "type": "integer",
            "description": "Quantos passaram pelos filtros, antes do limite."
          },
          "contatos": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "nome": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "telefone": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "email": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "empresa": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "negocios": {
                  "type": "integer"
                },
                "ultimasNotas": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "atualizadoEm": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Data e hora (ISO 8601), ou null."
                }
              },
              "required": [
                "id",
                "nome",
                "telefone",
                "email",
                "empresa",
                "negocios",
                "atualizadoEm"
              ]
            }
          }
        },
        "required": [
          "totalNoCrm",
          "encontrados",
          "contatos"
        ],
        "description": "Contatos do CRM."
      },
      "CrmTarefasResposta": {
        "type": "object",
        "properties": {
          "hoje": {
            "type": "string",
            "description": "A data de hoje no fuso da empresa (UTC-3)."
          },
          "atrasadas": {
            "type": "integer"
          },
          "paraHoje": {
            "type": "integer"
          },
          "tarefas": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "titulo": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "contato": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "contatoId": {
                  "type": "string"
                },
                "prazo": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Dia, YYYY-MM-DD."
                },
                "situacao": {
                  "type": "string",
                  "enum": [
                    "atrasadas",
                    "hoje",
                    "no prazo",
                    "sem prazo"
                  ]
                }
              },
              "required": [
                "id",
                "titulo",
                "contato",
                "prazo",
                "situacao"
              ]
            }
          }
        },
        "required": [
          "hoje",
          "atrasadas",
          "paraHoje",
          "tarefas"
        ],
        "description": "Tarefas abertas."
      },
      "CrmAlterarResposta": {
        "description": "Mudanças no CRM.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "false quando alguma mudança não foi gravada."
              },
              "feito": {
                "description": "O que foi feito, em texto."
              },
              "criados": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "tipo": {
                      "type": "string"
                    },
                    "id": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "tipo",
                    "id"
                  ]
                },
                "description": "Registros criados, com o id."
              },
              "aviso": {
                "type": "string",
                "description": "Aviso em texto pra mostrar ao dono."
              }
            },
            "required": [
              "ok",
              "feito",
              "criados"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "GooglePerfilResposta": {
        "type": "object",
        "properties": {
          "conectado": {
            "type": "boolean"
          },
          "perfil": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "nome": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "cidade": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "categoria": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "linkNoMaps": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "linkPraPedirAvaliacao": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "nome",
              "cidade",
              "categoria",
              "linkNoMaps",
              "linkPraPedirAvaliacao"
            ]
          },
          "iaEscreve": {
            "type": "boolean"
          },
          "custoDoRascunhoEmCreditos": {},
          "aviso": {
            "type": "string",
            "description": "Aviso em texto pra mostrar ao dono."
          }
        },
        "required": [
          "conectado",
          "perfil",
          "iaEscreve",
          "custoDoRascunhoEmCreditos"
        ],
        "description": "O perfil do Google conectado."
      },
      "GoogleAvaliacoesResposta": {
        "type": "object",
        "properties": {
          "notaMedia": {},
          "totalNoGoogle": {},
          "semResposta": {
            "type": "integer"
          },
          "avaliacoes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "avaliacao": {
                  "description": "O nome da avaliação no Google, pra google_rascunho e google_publicar."
                },
                "quem": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "estrelas": {},
                "comentario": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "em": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "resposta": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "properties": {
                    "texto": {},
                    "em": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "situacaoNoGoogle": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "em"
                  ]
                }
              },
              "required": [
                "quem",
                "estrelas",
                "comentario",
                "em",
                "resposta"
              ]
            }
          }
        },
        "required": [
          "notaMedia",
          "totalNoGoogle",
          "semResposta",
          "avaliacoes"
        ],
        "description": "Avaliações do Google."
      },
      "GoogleRascunhoResposta": {
        "description": "Rascunho. Nada foi publicado.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "tipo": {
                "type": "string",
                "enum": [
                  "resposta",
                  "post"
                ]
              },
              "rascunho": {
                "description": "O rascunho escrito pela IA."
              },
              "creditosGastos": {},
              "aviso": {
                "type": "string",
                "description": "Aviso em texto pra mostrar ao dono."
              }
            },
            "required": [
              "tipo",
              "rascunho",
              "creditosGastos",
              "aviso"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "GooglePublicarResposta": {
        "description": "Publicado no Google.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "tipo": {
                "type": "string",
                "enum": [
                  "resposta",
                  "post"
                ]
              },
              "resposta": {
                "description": "A resposta publicada (tipo resposta)."
              },
              "aviso": {
                "type": "string",
                "description": "Aviso em texto pra mostrar ao dono."
              },
              "post": {
                "description": "O post publicado (tipo post)."
              }
            },
            "required": [
              "ok",
              "tipo"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "GoogleConcorrentesResposta": {
        "type": "object",
        "properties": {
          "negocio": {},
          "cidade": {},
          "posicoes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "busca": {},
                "posicaoDoNegocio": {}
              },
              "required": [
                "posicaoDoNegocio"
              ]
            }
          },
          "concorrentes": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Quem aparece no Google Maps, com nota e avaliações."
          }
        },
        "required": [
          "negocio",
          "cidade",
          "posicoes",
          "concorrentes"
        ],
        "description": "Concorrentes no Google Maps."
      },
      "ParceiroClientesResposta": {
        "type": "object",
        "properties": {
          "parceiro": {},
          "totalDeClientes": {},
          "encontrados": {
            "type": "integer",
            "description": "Quantos passaram pelos filtros, antes do limite."
          },
          "clientes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "conta": {
                  "type": "string",
                  "description": "O `conta` pra passar nas outras ferramentas."
                },
                "negocio": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "email": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "whatsapp": {
                  "type": "string",
                  "enum": [
                    "conectado",
                    "não conectado"
                  ]
                },
                "plano": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "licencaAte": {},
                "clienteDesde": {}
              },
              "required": [
                "conta",
                "negocio",
                "email",
                "whatsapp",
                "plano",
                "clienteDesde"
              ]
            }
          }
        },
        "required": [
          "parceiro",
          "totalDeClientes",
          "encontrados",
          "clientes"
        ],
        "description": "Clientes do parceiro."
      },
      "AgenteCriarResposta": {
        "description": "Atendente montado. O número não foi conectado.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "atendente": {
                "type": "object",
                "properties": {
                  "nomeDaIa": {
                    "type": "string"
                  },
                  "negocio": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "saudacao": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "tom": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "marcaHorarioSozinha": {
                    "type": "boolean"
                  },
                  "regrasEscritasPeloModelo": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "nomeDaIa",
                  "negocio",
                  "saudacao",
                  "tom",
                  "marcaHorarioSozinha",
                  "regrasEscritasPeloModelo"
                ]
              },
              "segmento": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "cerebro": {
                "type": "object",
                "properties": {
                  "fichasQueJaExistiam": {
                    "type": "integer"
                  },
                  "fichasCriadas": {
                    "type": "integer"
                  },
                  "fichasAtualizadas": {
                    "type": "integer"
                  },
                  "fichasQueFalharam": {
                    "type": "integer"
                  },
                  "fichasComLacuna": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Títulos das fichas com [PREENCHER] ou [CONFIRMAR]."
                  },
                  "produtosCriados": {
                    "type": "integer"
                  },
                  "produtosQueJaExistiam": {
                    "type": "integer"
                  },
                  "produtosQueFalharam": {
                    "type": "integer"
                  },
                  "origem": {
                    "type": "string",
                    "enum": [
                      "site",
                      "modelo do ramo",
                      "conversa",
                      "nenhuma"
                    ]
                  }
                },
                "required": [
                  "fichasQueJaExistiam",
                  "fichasCriadas",
                  "fichasAtualizadas",
                  "fichasQueFalharam",
                  "fichasComLacuna",
                  "produtosCriados",
                  "produtosQueJaExistiam",
                  "produtosQueFalharam",
                  "origem"
                ]
              },
              "dadosDeExemplo": {
                "type": "string"
              },
              "whatsapp": {
                "type": "object",
                "properties": {
                  "conectado": {
                    "type": "boolean",
                    "description": "Sempre false: conectar é com o dono, no app."
                  },
                  "linkParaConectar": {
                    "type": "string"
                  },
                  "conexao": {
                    "type": "string"
                  },
                  "podeConectar": {
                    "type": [
                      "boolean",
                      "null"
                    ]
                  }
                },
                "required": [
                  "conectado",
                  "linkParaConectar",
                  "podeConectar"
                ]
              },
              "linkDoPainel": {
                "type": "string"
              },
              "proximosPassos": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "avisos": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "ok",
              "atendente",
              "segmento",
              "cerebro",
              "whatsapp",
              "linkDoPainel",
              "proximosPassos"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "AgenteTestarResposta": {
        "description": "A resposta da IA no ensaio. Nada foi enviado.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "resposta": {
                "type": "string",
                "description": "O que a IA responderia."
              },
              "semResposta": {
                "type": "boolean",
                "description": "true quando a IA não sabia a resposta."
              },
              "perguntaSemResposta": {
                "type": "string"
              },
              "aviso": {
                "type": "string",
                "description": "Aviso em texto pra mostrar ao dono."
              },
              "fontes": {
                "type": "array",
                "items": {}
              },
              "imagensQueEnviaria": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "titulo": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "titulo",
                    "url"
                  ]
                }
              }
            },
            "required": [
              "resposta",
              "semResposta"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "PedidosListarResposta": {
        "type": "object",
        "properties": {
          "etapas": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "etapaId": {
                  "type": "string"
                },
                "nome": {},
                "papel": {},
                "pedidos": {
                  "type": "integer"
                }
              },
              "required": [
                "etapaId",
                "pedidos"
              ]
            }
          },
          "totalDePedidos": {
            "type": "integer"
          },
          "encontrados": {
            "type": "integer",
            "description": "Quantos passaram pelos filtros, antes do limite."
          },
          "pedidos": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "numero": {
                  "type": "integer"
                },
                "nome": {
                  "type": "string",
                  "description": "Tipo e número, por exemplo \"OS 12\"."
                },
                "tipo": {
                  "type": "string",
                  "description": "`pedido`, `os` ou `orcamento`."
                },
                "etapa": {
                  "type": "string",
                  "description": "Nome da etapa no quadro."
                },
                "etapaId": {
                  "type": "string"
                },
                "situacao": {
                  "type": "string",
                  "enum": [
                    "orcamento",
                    "aberto",
                    "aprovado",
                    "andamento",
                    "pronto",
                    "entregue",
                    "cancelado"
                  ],
                  "description": "O papel da etapa."
                },
                "cliente": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "telefone": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "total": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Em reais (centavos divididos por 100); null quando não há valor."
                },
                "itens": {
                  "type": "string",
                  "description": "Os itens numa linha."
                },
                "pago": {
                  "type": "boolean"
                },
                "pagoEm": {},
                "previsao": {
                  "type": "string"
                },
                "responsavel": {
                  "type": "string"
                },
                "aprovacaoDoCliente": {
                  "type": "string"
                },
                "atualizadoEm": {
                  "description": "Última mudança, como gravada."
                }
              },
              "required": [
                "id",
                "numero",
                "nome",
                "tipo",
                "etapa",
                "etapaId",
                "situacao",
                "cliente",
                "telefone",
                "total",
                "itens",
                "pago"
              ],
              "description": "Um pedido, OS ou orçamento."
            }
          }
        },
        "required": [
          "etapas",
          "totalDePedidos",
          "encontrados",
          "pedidos"
        ],
        "description": "Pedidos, OS e orçamentos, do mais novo pro mais velho."
      },
      "PedidoLerResposta": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do registro, pra usar nas outras ferramentas."
          },
          "numero": {
            "type": "integer"
          },
          "nome": {
            "type": "string",
            "description": "Tipo e número, por exemplo \"OS 12\"."
          },
          "tipo": {
            "type": "string",
            "description": "`pedido`, `os` ou `orcamento`."
          },
          "etapa": {
            "type": "string",
            "description": "Nome da etapa no quadro."
          },
          "etapaId": {
            "type": "string"
          },
          "situacao": {
            "type": "string",
            "enum": [
              "orcamento",
              "aberto",
              "aprovado",
              "andamento",
              "pronto",
              "entregue",
              "cancelado"
            ],
            "description": "O papel da etapa."
          },
          "cliente": {
            "type": [
              "string",
              "null"
            ]
          },
          "telefone": {
            "type": [
              "string",
              "null"
            ]
          },
          "total": {
            "type": [
              "number",
              "null"
            ],
            "description": "Em reais (centavos divididos por 100); null quando não há valor."
          },
          "itens": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "tipo": {},
                "descricao": {},
                "quantidade": {},
                "unidade": {},
                "precoUnitario": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Em reais (centavos divididos por 100); null quando não há valor."
                },
                "desconto": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Em reais (centavos divididos por 100); null quando não há valor."
                },
                "total": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Em reais (centavos divididos por 100); null quando não há valor."
                },
                "produtoId": {
                  "type": "string"
                },
                "recusadoPeloCliente": {
                  "type": "boolean"
                }
              },
              "required": [
                "precoUnitario",
                "total"
              ]
            }
          },
          "pago": {
            "type": "boolean"
          },
          "pagoEm": {},
          "previsao": {
            "type": "string"
          },
          "responsavel": {
            "type": "string"
          },
          "aprovacaoDoCliente": {
            "type": "string"
          },
          "atualizadoEm": {
            "description": "Última mudança, como gravada."
          },
          "totais": {
            "type": "object",
            "properties": {
              "subtotal": {
                "type": "number"
              },
              "produtos": {
                "type": "number"
              },
              "servicos": {
                "type": "number"
              },
              "desconto": {
                "type": "number"
              },
              "taxa": {
                "type": "number"
              },
              "total": {
                "type": "number"
              }
            },
            "required": [
              "subtotal",
              "produtos",
              "servicos",
              "desconto",
              "taxa",
              "total"
            ],
            "description": "Em reais (centavos divididos por 100)."
          },
          "endereco": {},
          "formaDePagamento": {},
          "observacaoParaOCliente": {},
          "notasInternas": {},
          "equipamento": {},
          "aprovacao": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "resultado": {},
              "nome": {},
              "em": {},
              "via": {}
            }
          },
          "cobrancaId": {
            "type": [
              "string",
              "null"
            ]
          },
          "links": {
            "type": "object",
            "properties": {
              "aprovar": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "acompanhar": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "aprovar",
              "acompanhar"
            ],
            "description": "Links de aprovação e de acompanhamento, quando o dono já gerou."
          },
          "historico": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "em": {},
                "tipo": {},
                "texto": {}
              }
            }
          }
        },
        "required": [
          "id",
          "numero",
          "nome",
          "tipo",
          "etapa",
          "etapaId",
          "situacao",
          "cliente",
          "telefone",
          "total",
          "itens",
          "pago",
          "totais",
          "endereco",
          "formaDePagamento",
          "observacaoParaOCliente",
          "notasInternas",
          "aprovacao",
          "cobrancaId",
          "links",
          "historico"
        ],
        "description": "Um pedido inteiro."
      },
      "PedidoCriarResposta": {
        "description": "Pedido criado.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "pedido": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "numero": {
                    "type": "integer"
                  },
                  "nome": {
                    "type": "string"
                  },
                  "tipo": {
                    "type": "string"
                  },
                  "etapaId": {
                    "type": "string"
                  },
                  "total": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Em reais (centavos divididos por 100); null quando não há valor."
                  },
                  "itens": {
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "numero",
                  "nome",
                  "tipo",
                  "etapaId",
                  "total",
                  "itens"
                ]
              },
              "estoque": {
                "type": "string",
                "description": "O que aconteceu com o estoque."
              },
              "aviso": {
                "type": "string",
                "description": "Lembrete de que o cliente não foi avisado: a API não manda mensagem."
              }
            },
            "required": [
              "ok",
              "pedido",
              "aviso"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "PedidoMudarEtapaResposta": {
        "description": "Etapa do pedido.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "mudou": {
                "type": "boolean",
                "description": "false quando o pedido já estava nessa etapa."
              },
              "pedido": {
                "type": "string"
              },
              "de": {
                "type": "string"
              },
              "para": {
                "type": "string"
              },
              "estoque": {
                "type": "string"
              },
              "aviso": {
                "type": "string",
                "description": "Lembrete de que o cliente não foi avisado: a API não manda mensagem."
              }
            },
            "required": [
              "ok",
              "mudou",
              "de",
              "para"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "CobrancasListarResposta": {
        "type": "object",
        "properties": {
          "contaDeCobranca": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "situacao": {},
              "pixPronto": {
                "type": "boolean"
              },
              "iaPodeCobrar": {
                "type": "boolean"
              }
            },
            "required": [
              "pixPronto",
              "iaPodeCobrar"
            ]
          },
          "aviso": {
            "type": "string",
            "description": "Aviso em texto pra mostrar ao dono."
          },
          "resumo": {
            "type": "object",
            "properties": {
              "pendentes": {
                "type": "integer"
              },
              "vencidas": {
                "type": "integer"
              },
              "pagas": {
                "type": "integer"
              },
              "aReceber": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Em reais (centavos divididos por 100); null quando não há valor."
              },
              "recebido": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Em reais (centavos divididos por 100); null quando não há valor."
              }
            },
            "required": [
              "pendentes",
              "vencidas",
              "pagas",
              "aReceber",
              "recebido"
            ]
          },
          "planosDeAssinatura": {
            "type": "integer"
          },
          "assinaturas": {
            "type": "integer"
          },
          "encontradas": {
            "type": "integer",
            "description": "Quantos passaram pelos filtros, antes do limite."
          },
          "cobrancas": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "cliente": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "telefone": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "valor": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Em reais (centavos divididos por 100); null quando não há valor."
                },
                "descricao": {},
                "vencimento": {},
                "metodo": {},
                "situacao": {
                  "description": "`pendente`, `paga`, `vencida`, `estornada` ou `cancelada`."
                },
                "origem": {},
                "link": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "pagaEm": {},
                "valorPago": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Em reais (centavos divididos por 100); null quando não há valor."
                },
                "mandadaAoCliente": {
                  "type": "boolean"
                },
                "ref": {}
              },
              "required": [
                "id",
                "cliente",
                "telefone",
                "valor",
                "link",
                "mandadaAoCliente"
              ]
            }
          }
        },
        "required": [
          "contaDeCobranca",
          "resumo",
          "planosDeAssinatura",
          "assinaturas",
          "encontradas",
          "cobrancas"
        ],
        "description": "Cobranças, da mais nova pra mais velha."
      },
      "CobrancaCriarResposta": {
        "description": "Cobrança criada (não foi mandada ao cliente).",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "ok": {
                "type": "boolean",
                "description": "Sempre true quando a operação foi feita."
              },
              "jaExistia": {
                "type": "boolean",
                "description": "true quando devolveu uma cobrança que já existia."
              },
              "explicacao": {
                "type": "string"
              },
              "divergencia": {
                "type": "string"
              },
              "cobranca": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "situacao": {},
                  "valor": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Em reais (centavos divididos por 100); null quando não há valor."
                  },
                  "descricao": {},
                  "vencimento": {},
                  "metodo": {},
                  "link": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "pixCopiaECola": {
                    "type": "string",
                    "description": "Código copia e cola do Pix."
                  },
                  "linhaDigitavel": {
                    "type": "string"
                  },
                  "boleto": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "pedido": {
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "situacao",
                  "valor",
                  "descricao",
                  "vencimento",
                  "metodo",
                  "link"
                ]
              },
              "avisoDoPedido": {
                "type": "string"
              },
              "aviso": {
                "type": "string",
                "description": "Aviso em texto pra mostrar ao dono."
              }
            },
            "required": [
              "ok",
              "cobranca",
              "aviso"
            ]
          },
          {
            "$ref": "#/components/schemas/SimulacaoSandbox"
          }
        ]
      },
      "RetornosListarResposta": {
        "type": "object",
        "properties": {
          "resumo": {},
          "mensagensQueSairamHoje": {},
          "roteirosLigados": {
            "type": "array",
            "items": {}
          },
          "encontrados": {
            "type": "integer",
            "description": "Quantos passaram pelos filtros, antes do limite."
          },
          "retornos": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "roteiroId": {},
                "roteiro": {},
                "cliente": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "telefone": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "sobre": {},
                "motivo": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "situacao": {
                  "description": "`pendente`, `enviado`, `agendado`, `convertido`, `dispensado` ou o valor cru."
                },
                "saiEm": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Data e hora (ISO 8601), ou null."
                },
                "saiuEm": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Data e hora (ISO 8601), ou null."
                },
                "venceEm": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Data e hora (ISO 8601), ou null."
                },
                "respondeu": {
                  "type": "boolean"
                },
                "receita": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Em reais (centavos divididos por 100); null quando não há valor."
                },
                "travadoPor": {},
                "mensagem": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "roteiro",
                "cliente",
                "telefone",
                "motivo",
                "venceEm",
                "respondeu"
              ]
            }
          }
        },
        "required": [
          "resumo",
          "mensagensQueSairamHoje",
          "roteirosLigados",
          "encontrados",
          "retornos"
        ],
        "description": "Retornos criados pelos roteiros ligados."
      },
      "RetornoRoteirosResposta": {
        "type": "object",
        "properties": {
          "recomendadosPraConta": {
            "type": "array",
            "items": {}
          },
          "roteiros": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "nicho": {},
                "titulo": {},
                "descricao": {},
                "ligado": {
                  "type": "boolean"
                },
                "intervaloDias": {},
                "avisaDiasAntes": {},
                "mensagem": {},
                "resultado": {
                  "type": "object",
                  "additionalProperties": true
                }
              },
              "required": [
                "id",
                "ligado"
              ]
            }
          },
          "comoLigar": {
            "type": "string"
          },
          "previa": {
            "type": "object",
            "properties": {
              "roteiroId": {
                "type": "string"
              },
              "seriamLembradosEm7Dias": {},
              "jaSairiamHoje": {},
              "exemplos": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "cliente": {},
                    "motivo": {},
                    "saiEm": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Data e hora (ISO 8601), ou null."
                    }
                  },
                  "required": [
                    "saiEm"
                  ]
                }
              },
              "mensagemDeExemplo": {},
              "tetoPorDia": {}
            },
            "required": [
              "roteiroId",
              "seriamLembradosEm7Dias",
              "jaSairiamHoje",
              "exemplos",
              "mensagemDeExemplo"
            ],
            "description": "A prévia, só com `roteiro_id`."
          }
        },
        "required": [
          "recomendadosPraConta",
          "roteiros",
          "comoLigar"
        ],
        "description": "Roteiros de retorno prontos."
      },
      "ComissoesResumoResposta": {
        "type": "object",
        "properties": {
          "mes": {},
          "regrasDeComissao": {
            "type": "integer"
          },
          "regraAntiga": {
            "type": "string"
          },
          "profissionais": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Cada profissional com base, comissão, pago e a pagar, em reais."
          },
          "semComissao": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "motivo": {
                  "type": "string"
                },
                "explicacao": {
                  "type": "string"
                },
                "quantos": {}
              },
              "required": [
                "motivo",
                "explicacao"
              ]
            }
          },
          "repasses": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {},
                "staffId": {},
                "total": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Em reais (centavos divididos por 100); null quando não há valor."
                },
                "pagoEm": {},
                "lancadoNoCaixa": {
                  "type": "boolean"
                }
              },
              "required": [
                "lancadoNoCaixa"
              ]
            }
          },
          "linhas": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "comoPagar": {
            "type": "string"
          }
        },
        "required": [
          "mes",
          "regrasDeComissao",
          "profissionais",
          "semComissao",
          "repasses",
          "comoPagar"
        ],
        "description": "Comissões do mês."
      },
      "PetsListarResposta": {
        "type": "object",
        "properties": {
          "totalDePets": {
            "type": "integer"
          },
          "encontrados": {
            "type": "integer",
            "description": "Quantos passaram pelos filtros, antes do limite."
          },
          "tutores": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "contatoId": {
                  "type": "string"
                },
                "tutor": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "telefone": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "pets": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "nome": {
                        "type": "string"
                      },
                      "faleceu": {
                        "type": "boolean"
                      }
                    },
                    "required": [
                      "nome"
                    ]
                  }
                }
              },
              "required": [
                "contatoId",
                "tutor",
                "telefone",
                "pets"
              ]
            }
          }
        },
        "required": [
          "totalDePets",
          "encontrados",
          "tutores"
        ],
        "description": "Pets e tutores."
      },
      "PetProntuarioLerResposta": {
        "type": "object",
        "properties": {
          "pet": {
            "type": "string"
          },
          "contatoId": {
            "type": "string"
          },
          "prontuarioExiste": {
            "type": "boolean"
          },
          "faleceu": {
            "type": "boolean"
          },
          "ficha": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true
          },
          "pesoAtual": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "kg": {},
              "data": {}
            }
          },
          "pesos": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "data": {},
                "kg": {}
              }
            }
          },
          "aplicacoes": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Vacinas e antiparasitários aplicados, do mais recente pro mais antigo."
          },
          "proximasDoses": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "totalDeAtendimentos": {
            "type": "integer"
          },
          "atendimentos": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "documentos": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {},
                "tipo": {},
                "emitidoEm": {},
                "saiuProTutor": {
                  "type": "boolean"
                }
              },
              "required": [
                "saiuProTutor"
              ]
            }
          }
        },
        "required": [
          "pet",
          "contatoId",
          "prontuarioExiste",
          "ficha",
          "pesoAtual",
          "pesos",
          "aplicacoes",
          "proximasDoses",
          "totalDeAtendimentos",
          "atendimentos",
          "documentos"
        ],
        "description": "O prontuário de um pet."
      },
      "PetVacinasProximasResposta": {
        "type": "object",
        "properties": {
          "janelaDias": {
            "type": "integer"
          },
          "atrasadas": {
            "type": "integer"
          },
          "encontradas": {
            "type": "integer",
            "description": "Quantos passaram pelos filtros, antes do limite."
          },
          "doses": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "contatoId": {
                  "type": "string"
                },
                "pet": {
                  "type": "string"
                },
                "nome": {},
                "tipo": {},
                "dose": {},
                "vence": {},
                "diasParaVencer": {
                  "type": "number",
                  "description": "Negativo quando já venceu."
                },
                "situacao": {},
                "ultimaAplicacao": {},
                "tutor": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "telefone": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "contatoId",
                "pet",
                "diasParaVencer",
                "ultimaAplicacao",
                "tutor",
                "telefone"
              ]
            }
          },
          "aviso": {
            "type": "string",
            "description": "Aviso em texto pra mostrar ao dono."
          }
        },
        "required": [
          "janelaDias",
          "atrasadas",
          "encontradas",
          "doses",
          "aviso"
        ],
        "description": "Próximas doses dos pets, da mais atrasada pra mais distante."
      },
      "ImoveisListarResposta": {
        "type": "object",
        "properties": {
          "painel": {
            "description": "O painel da carteira."
          },
          "totalNaCarteira": {
            "type": "integer"
          },
          "encontrados": {
            "type": "integer",
            "description": "Quantos passaram pelos filtros, antes do limite."
          },
          "imoveis": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "codigo": {},
                "titulo": {},
                "tipo": {},
                "transacao": {},
                "situacao": {},
                "precoVenda": {},
                "precoAluguel": {},
                "bairro": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "cidade": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "quartos": {},
                "vagas": {},
                "areaUtil": {},
                "fotos": {
                  "type": "integer",
                  "description": "Quantas fotos."
                },
                "nosPortais": {
                  "type": "boolean"
                },
                "naVitrine": {
                  "type": "boolean"
                },
                "faltaParaOsPortais": {
                  "type": "array",
                  "items": {}
                },
                "interessados": {},
                "visitas": {},
                "diasNoMercado": {}
              },
              "required": [
                "id",
                "precoVenda",
                "precoAluguel",
                "bairro",
                "cidade",
                "quartos",
                "vagas",
                "areaUtil",
                "fotos",
                "nosPortais",
                "naVitrine",
                "interessados",
                "visitas",
                "diasNoMercado"
              ]
            }
          }
        },
        "required": [
          "painel",
          "totalNaCarteira",
          "encontrados",
          "imoveis"
        ],
        "description": "A carteira de imóveis."
      },
      "ImovelLerResposta": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do registro, pra usar nas outras ferramentas."
          },
          "codigo": {},
          "titulo": {},
          "tipo": {},
          "transacao": {},
          "situacao": {},
          "precoVenda": {},
          "precoAluguel": {},
          "condominio": {},
          "iptuAnual": {},
          "areaUtil": {},
          "areaTotal": {},
          "quartos": {},
          "suites": {},
          "banheiros": {},
          "vagas": {},
          "caracteristicas": {
            "type": "array",
            "items": {}
          },
          "endereco": {
            "type": "object",
            "additionalProperties": true
          },
          "descricao": {
            "type": [
              "string",
              "null"
            ]
          },
          "totalDeFotos": {
            "type": "integer"
          },
          "fotos": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Até 20 endereços de foto."
          },
          "video": {
            "type": [
              "string",
              "null"
            ]
          },
          "publicarNosPortais": {
            "type": "boolean"
          },
          "nosPortais": {
            "type": "boolean"
          },
          "naVitrine": {
            "type": "boolean"
          },
          "faltaParaOsPortais": {
            "type": "array",
            "items": {}
          },
          "interessados": {},
          "visitas": {},
          "diasNoMercado": {},
          "criadoEm": {},
          "atualizadoEm": {}
        },
        "required": [
          "id",
          "precoVenda",
          "precoAluguel",
          "condominio",
          "iptuAnual",
          "areaUtil",
          "areaTotal",
          "quartos",
          "suites",
          "banheiros",
          "vagas",
          "caracteristicas",
          "endereco",
          "descricao",
          "totalDeFotos",
          "fotos",
          "video",
          "publicarNosPortais",
          "nosPortais",
          "naVitrine",
          "faltaParaOsPortais",
          "interessados",
          "visitas",
          "diasNoMercado",
          "criadoEm",
          "atualizadoEm"
        ],
        "description": "Um imóvel inteiro."
      },
      "ImobLeadsRoletaResposta": {
        "type": "object",
        "properties": {
          "roleta": {
            "type": "object",
            "properties": {
              "ligada": {
                "type": "boolean"
              },
              "modo": {},
              "comoDistribui": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "prazoParaAceitarMinutos": {},
              "repassaQuandoEstoura": {
                "type": "boolean"
              },
              "maxTentativas": {}
            },
            "required": [
              "ligada",
              "modo",
              "comoDistribui",
              "prazoParaAceitarMinutos",
              "repassaQuandoEstoura",
              "maxTentativas"
            ]
          },
          "faltaNaRoleta": {
            "type": "array",
            "items": {}
          },
          "corretores": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Corretores, sem telefone, e-mail nem link pessoal."
          },
          "resumo30Dias": {
            "type": "object",
            "properties": {
              "leads": {
                "type": "integer"
              },
              "aguardando": {
                "type": "integer"
              },
              "aceitos": {
                "type": "integer"
              },
              "semCorretor": {
                "type": "integer"
              },
              "atrasados": {
                "type": "integer"
              }
            },
            "required": [
              "leads",
              "aguardando",
              "aceitos",
              "semCorretor",
              "atrasados"
            ]
          },
          "encontrados": {
            "type": "integer",
            "description": "Quantos passaram pelos filtros, antes do limite."
          },
          "leads": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "desempenho": {
            "type": "object",
            "properties": {
              "dias": {},
              "corretores": {},
              "totais": {}
            },
            "required": [
              "dias",
              "corretores",
              "totais"
            ]
          }
        },
        "required": [
          "roleta",
          "corretores",
          "resumo30Dias",
          "encontrados",
          "leads"
        ],
        "description": "Leads e roleta de corretores."
      },
      "NotasListarResposta": {
        "type": "object",
        "properties": {
          "emissor": {
            "type": "object",
            "properties": {
              "configurado": {
                "type": "boolean"
              },
              "ativo": {
                "type": "boolean"
              },
              "provedor": {},
              "ambiente": {},
              "falta": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "configurado",
              "ativo",
              "provedor",
              "ambiente"
            ]
          },
          "resumo": {
            "type": "object",
            "properties": {
              "emitidas": {
                "type": "integer"
              },
              "comErro": {
                "type": "integer"
              },
              "canceladas": {
                "type": "integer"
              },
              "rascunhos": {
                "type": "integer"
              },
              "faturado": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Em reais (centavos divididos por 100); null quando não há valor."
              }
            },
            "required": [
              "emitidas",
              "comErro",
              "canceladas",
              "rascunhos",
              "faturado"
            ]
          },
          "encontradas": {
            "type": "integer",
            "description": "Quantos passaram pelos filtros, antes do limite."
          },
          "notas": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id do registro, pra usar nas outras ferramentas."
                },
                "modelo": {
                  "type": "string",
                  "description": "`nfse`, `nfce` ou `nfe`."
                },
                "situacao": {
                  "type": "string",
                  "description": "`emitida`, `erro`, `cancelada` ou `rascunho`."
                },
                "numero": {
                  "type": [
                    "string",
                    "number",
                    "null"
                  ]
                },
                "valor": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Em reais (centavos divididos por 100); null quando não há valor."
                },
                "cliente": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "descricao": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "competencia": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "emitidaEm": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "origem": {
                  "type": "string",
                  "enum": [
                    "automatica",
                    "manual"
                  ]
                },
                "erro": {
                  "type": "string",
                  "description": "Motivo da recusa."
                },
                "pdf": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "modelo",
                "situacao",
                "numero",
                "valor",
                "cliente",
                "descricao",
                "competencia",
                "emitidaEm",
                "origem"
              ]
            }
          },
          "comoEmitir": {
            "type": "string"
          }
        },
        "required": [
          "emissor",
          "resumo",
          "encontradas",
          "notas",
          "comoEmitir"
        ],
        "description": "Notas fiscais. Nada é emitido nem cancelado por aqui."
      },
      "NotaStatusResposta": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id do registro, pra usar nas outras ferramentas."
          },
          "modelo": {
            "type": "string",
            "description": "`nfse`, `nfce` ou `nfe`."
          },
          "situacao": {
            "type": "string",
            "description": "`emitida`, `erro`, `cancelada` ou `rascunho`."
          },
          "numero": {
            "type": [
              "string",
              "number",
              "null"
            ]
          },
          "valor": {
            "type": [
              "number",
              "null"
            ],
            "description": "Em reais (centavos divididos por 100); null quando não há valor."
          },
          "cliente": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "nome": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "documento": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Documento do cliente; o de pessoa física sai mascarado."
              },
              "email": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "nome",
              "documento",
              "email"
            ]
          },
          "descricao": {
            "type": [
              "string",
              "null"
            ]
          },
          "competencia": {
            "type": [
              "string",
              "null"
            ]
          },
          "emitidaEm": {
            "type": [
              "string",
              "null"
            ]
          },
          "origem": {
            "type": "string",
            "enum": [
              "automatica",
              "manual"
            ]
          },
          "erro": {
            "type": "string",
            "description": "Motivo da recusa."
          },
          "pdf": {
            "type": [
              "string",
              "null"
            ]
          },
          "explicacao": {
            "type": [
              "string",
              "null"
            ]
          },
          "chave": {
            "type": [
              "string",
              "null"
            ]
          },
          "serie": {},
          "iss": {
            "type": [
              "number",
              "null"
            ],
            "description": "Em reais (centavos divididos por 100); null quando não há valor."
          },
          "retido": {
            "type": [
              "number",
              "null"
            ],
            "description": "Em reais (centavos divididos por 100); null quando não há valor."
          },
          "liquido": {
            "type": [
              "number",
              "null"
            ],
            "description": "Em reais (centavos divididos por 100); null quando não há valor."
          },
          "canceladaEm": {},
          "motivoDoCancelamento": {
            "type": [
              "string",
              "null"
            ]
          },
          "xml": {
            "type": [
              "string",
              "null"
            ]
          },
          "ambiente": {
            "type": [
              "string",
              "null"
            ]
          },
          "provedor": {
            "type": [
              "string",
              "null"
            ]
          },
          "mandadaAoCliente": {},
          "de": {
            "type": "object",
            "properties": {
              "tipo": {},
              "id": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "id"
            ]
          }
        },
        "required": [
          "id",
          "modelo",
          "situacao",
          "numero",
          "valor",
          "cliente",
          "descricao",
          "competencia",
          "emitidaEm",
          "origem",
          "pdf",
          "explicacao",
          "chave",
          "serie",
          "iss",
          "retido",
          "liquido",
          "xml",
          "ambiente",
          "provedor",
          "mandadaAoCliente"
        ],
        "description": "A situação de uma nota fiscal, como gravada."
      },
      "ClinicaNpsResumoResposta": {
        "type": "object",
        "properties": {
          "periodoDias": {
            "type": "integer"
          },
          "nps": {
            "description": "A nota NPS (-100 a 100), ou null."
          },
          "pesquisasQueSairam": {},
          "respostas": {},
          "taxaDeResposta": {},
          "promotores": {},
          "neutros": {},
          "detratores": {},
          "tocaramEmAvaliarNoGoogle": {},
          "porProfissional": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "profissional": {},
                "nps": {},
                "respostas": {}
              },
              "required": [
                "profissional"
              ]
            }
          },
          "porMes": {
            "type": "array",
            "items": {}
          },
          "comentarios": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "nota": {},
                "comentario": {},
                "paciente": {},
                "em": {},
                "profissional": {}
              },
              "required": [
                "paciente",
                "em"
              ]
            }
          },
          "aviso": {
            "type": "string",
            "description": "Aviso em texto pra mostrar ao dono."
          }
        },
        "required": [
          "periodoDias",
          "nps",
          "pesquisasQueSairam",
          "respostas",
          "taxaDeResposta",
          "promotores",
          "neutros",
          "detratores",
          "tocaramEmAvaliarNoGoogle",
          "porProfissional",
          "porMes",
          "comentarios"
        ],
        "description": "Pesquisa depois da consulta."
      },
      "JsonRpcPedido": {
        "type": "object",
        "required": [
          "jsonrpc",
          "method"
        ],
        "properties": {
          "jsonrpc": {
            "type": "string",
            "const": "2.0"
          },
          "id": {
            "type": [
              "string",
              "integer"
            ]
          },
          "method": {
            "type": "string",
            "examples": [
              "initialize",
              "ping",
              "tools/list",
              "tools/call"
            ]
          },
          "params": {
            "type": "object",
            "additionalProperties": true
          }
        }
      },
      "JsonRpcResposta": {
        "type": "object",
        "description": "Resposta JSON-RPC 2.0: `result` quando deu certo, `error` quando o pedido não pôde ser atendido.",
        "required": [
          "jsonrpc",
          "id"
        ],
        "properties": {
          "jsonrpc": {
            "type": "string",
            "const": "2.0"
          },
          "id": {
            "type": [
              "string",
              "integer",
              "null"
            ]
          },
          "result": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/McpInitializeResultado"
              },
              {
                "$ref": "#/components/schemas/McpToolsListResultado"
              },
              {
                "$ref": "#/components/schemas/McpToolsCallResultado"
              },
              {
                "$ref": "#/components/schemas/McpPingResultado"
              }
            ]
          },
          "error": {
            "$ref": "#/components/schemas/JsonRpcErro"
          }
        }
      },
      "JsonRpcErro": {
        "type": "object",
        "description": "Erro JSON-RPC 2.0: -32700 JSON inválido, -32600 pedido inválido, -32601 método inexistente, -32602 parâmetros inválidos (ferramenta desconhecida, `arguments` que não é objeto).",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "integer",
            "enum": [
              -32700,
              -32600,
              -32601,
              -32602
            ]
          },
          "message": {
            "type": "string"
          },
          "data": {}
        }
      },
      "McpInitializeResultado": {
        "type": "object",
        "description": "Resultado do `initialize`.",
        "required": [
          "protocolVersion",
          "capabilities",
          "serverInfo",
          "instructions"
        ],
        "properties": {
          "protocolVersion": {
            "type": "string",
            "enum": [
              "2025-11-25",
              "2025-06-18",
              "2025-03-26"
            ]
          },
          "capabilities": {
            "type": "object",
            "additionalProperties": true
          },
          "serverInfo": {
            "type": "object",
            "required": [
              "name",
              "title",
              "version"
            ],
            "properties": {
              "name": {
                "type": "string"
              },
              "title": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "instructions": {
            "type": "string"
          }
        }
      },
      "McpToolsListResultado": {
        "type": "object",
        "description": "Resultado do `tools/list`: as ferramentas que esta chave alcança, com o esquema de entrada.",
        "required": [
          "tools"
        ],
        "properties": {
          "tools": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "title",
                "description",
                "inputSchema",
                "annotations"
              ],
              "properties": {
                "name": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "inputSchema": {
                  "type": "object",
                  "additionalProperties": true
                },
                "annotations": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      },
      "McpToolsCallResultado": {
        "type": "object",
        "description": "Resultado do `tools/call`. `content[0].text` traz o resultado da ferramenta como texto JSON, no mesmo formato do 200 do REST dessa ferramenta (`<Ferramenta>Resposta`); com `isError: true`, traz a mensagem de erro e o código.",
        "required": [
          "content",
          "isError"
        ],
        "properties": {
          "content": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "object",
              "required": [
                "type",
                "text"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "const": "text"
                },
                "text": {
                  "type": "string"
                }
              }
            }
          },
          "isError": {
            "type": "boolean"
          }
        }
      },
      "McpPingResultado": {
        "type": "object",
        "description": "Resultado do `ping`: objeto vazio.",
        "maxProperties": 0
      }
    },
    "responses": {
      "Erro400": {
        "description": "Parâmetro inválido ou pedido recusado (`parametros_invalidos`, `json_invalido`, `pedido_recusado`, `operacao_invalida`, `outra_conta` e outros). Formato `Erro`.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      },
      "Erro401": {
        "description": "Chave ausente, inválida, vencida ou revogada (`chave_invalida`), mandada na URL (`chave_na_url`), ou de uma conta que não existe mais (`conta_inexistente`). Formato `Erro`.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      },
      "Erro402": {
        "description": "A conta não pode usar a API ou o recurso (`plano`), ou acabaram os créditos (`sem_credito`). Formato `Erro`.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      },
      "Erro403": {
        "description": "Sem escopo (`escopo_insuficiente`), escrita com chave de teste fora da simulação (`sandbox`), sem acesso (`sem_acesso`, `nao_parceiro`) ou sem acesso à conta pedida (`conta_sem_acesso`, `conta_fora_da_chave`). Formato `Erro`.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      },
      "Erro404": {
        "description": "Endereço ou registro inexistente (`rota_inexistente`, `nao_encontrado`, `conta_inexistente` e os `*_nao_encontrado` de cada ferramenta). Formato `Erro`.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      },
      "Erro409": {
        "description": "Conflito com o que já existe, ou falta a confirmação do dono (`conflito`, `horario_ocupado`, `site_existe`, `agente_ja_existe`, `precisa_confirmar`, `agendamento_cancelado`, `meta_nao_conectada`, `meta_reconectar`, `google_nao_conectado`, `google_sem_perfil`). Formato `Erro`.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      },
      "Erro413": {
        "description": "Corpo acima de 1 MB (`corpo_grande`). Formato `Erro`.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      },
      "Erro423": {
        "description": "O Cérebro desta conta está trancado com PIN (`cerebro_trancado`): o dono destrava no app. Formato `Erro`.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      },
      "Erro429": {
        "description": "Limite por minuto da chave (`limite`, com `Retry-After`), limite próprio de uma ferramenta (`limite`) ou cota diária da conta (`limite_diario`). Formato `Erro`.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          },
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          },
          "RateLimit": {
            "$ref": "#/components/headers/RateLimit"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimitRemaining"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      },
      "Erro500": {
        "description": "Falha do nosso lado (`falha_interna`). Tente de novo. Formato `Erro`.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      },
      "Erro502": {
        "description": "Um serviço de que a operação depende não respondeu (`falha`, `falha_de_acesso`, `meta_falhou`, `google_falhou`). Tente de novo. Formato `Erro`.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      },
      "Erro503": {
        "description": "Indisponível agora (`indisponivel`, `nao_configurado`, `google_nao_liberado`). Tente de novo. Formato `Erro`.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      },
      "ErroPadrao": {
        "description": "Outro erro, no mesmo formato `Erro`.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      },
      "ErroMcp400": {
        "description": "Erro de protocolo: JSON inválido (-32700), mensagem ou lote inválido (-32600) ou `MCP-Protocol-Version` não suportada, num `JsonRpcResposta` com `error` e `id` null. Antes de chegar ao MCP, o servidor também pode recusar `customerUid` de outra conta com 400 no formato `Erro` (`outra_conta`).",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "oneOf": [
                {
                  "$ref": "#/components/schemas/JsonRpcResposta"
                },
                {
                  "$ref": "#/components/schemas/Erro"
                }
              ]
            }
          }
        }
      },
      "ErroMcp401": {
        "description": "Chave ausente, inválida, vencida ou revogada (`chave_invalida`) ou mandada na URL (`chave_na_url`), no formato `Erro`. Sem chave, vem `WWW-Authenticate` com os metadados OAuth.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          },
          "WWW-Authenticate": {
            "$ref": "#/components/headers/WWWAuthenticate"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      }
    }
  }
}